//1. 循環對象
let obj = {
name: 'hello',
age: 25
}
for (let i in obj){
console.log(i)
// name age
}
for(let i of obj){
console.log(i)
// Uncaught TypeError: obj is not iterable 報錯了,由於對象沒有部署Symbol.iterator 屬性。
}
//2. 循環數組
let arr = ['a','b','c'];
for(let i in arr){
console.log(i) // 0,1,2
}
for(let i of arr){
console.log(i) // a,b,c
}
複製代碼
window.onhashchange = function(event){
consoel.log(event)// 返回一個
}
複製代碼
#+路由
window.history.popState('傳參','標題','跳轉的路由地址')
、windown.history.pushState()
、以及window.history.replaceState('傳參','標題','跳轉的路由地址')
window.history.pushState
只是改變了後面的路由,頁面並無跳轉,也沒有從新加載。repalceState
也是同樣。window.onpopState
只有在點擊瀏覽器的前進或者後退按鈕纔會出觸發,或者調用history.back()
、forward()
等方法更新視圖可是不從新加載頁面
pushState
和replaceState
這兩個方法雖說修改了瀏覽器的歷史記錄棧,雖然當前的url路由改變了,可是不會從新加載頁面。這就爲了更新視圖但不從新加載頁面
提供了基礎。npm i vue-lazyload
import vueLazy form 'vue-lazyload'
Vue.use(vueLazy,{
preLoad: 1, //提早加載的高度,數字1表明一屏的高度
error: imgUrl, //圖片加載失敗時顯示的圖片
loading: imgUrl, //圖片加載成功顯示的圖片
attempt: 2 //圖片加載錯誤後,最大的嘗試次數
})
複製代碼
export default new Store({
state:{
count:2
}
})
複製代碼
export default new Store({
state:{
count:2
},
mutations:{
changeCount(state,n){
state.count += n
}
}
})
mounted(){
this.$store.commit('changeCount',5)
}
//在html中用{{$store.state.count}}
複製代碼
{dispatch, commit, getters, state, rootGetters...}
等等方法,actions方法通常是用來調用mutations的,咱們能夠解構賦值{commit},直接使用。export default new Store({
state:{
count:2
},
mutations:{
changeCount(state,n){
state.count += n
}
},
actions:{
yiCount(context,n){
}
}
// 項目中通常都是這樣寫的
actions:{
yiCount({commit},n){
commit('changeCount',5)
}
}
})
mounted(){
this.$store.dispatch('yiCount',5)
}
複製代碼
this.$store.getters.filTodos
調用。可是它不會改變state中的變量。 export default new Store({
state:{
count:2,
todos:todos: [
{ id: 1, text: "你好", done: true },
{ id: 2, text: "世界", done: false },
],
},
getters:{
filTodos(state){
state.todos.filter((item)=>{
return item.done
})
}
}
})
//組件中調用
mounted(){
let a = this.$store.getters.filTodos
//{ id: 1, text: "你好", done: true },
}
複製代碼
display:flex
display:inline-flex
flex-diretion
flex-direction:row
:主軸水平方向,從左到右flex-diretion:row-reverse
:主軸方向,從右到左flex-diretion:column
:垂直方向,從上到下css
flex-diretion:column-reverse
:主軸方向,從下往上html
flex-wrap:nowrap
//默認,若是不換行,當項目寬度超過之後,它的寬度會失效,變成全部項目在一行內平分寬度。flex-wrap:wrap
//換行,第一行在上方flex-wrap:wrap-reverse
//換行第一行在下方justify-content:flex-start
//默認左對齊justify-content:center
//居中對齊justify-content:flex-end
//右對齊justify-content:space-between
// 左右兩個項目貼邊對齊,中間的項目間隔相等。justify-content:space-around
//左右兩個項目是中間項目之間間隔的一半。align-item:flex-start
//從上往下默認align-item:center
//居中align-item:flex-end
//從下往上align-item:baseline
//基線對齊,其實就是項目中全部文字的最底端對齊ul>li{order:1}
,全部li項目都是1,它的排列順序是不會有變化的。假設須要第二個li排在最前面,咱們能夠設置li:nth-child(2){order:-10}
,order的值越小排序越靠前。
order:2
flex-grow
這個設置項目的比例flex-grow:1
flex-shrink:0
// 默認是0<div>
<p></p>
</div>
<style> div{ display:flex; justify-content:center; align-item:center; } </style>
複製代碼
let obj = {name:'你好',b:{age:25}}
function shallowClone(obj){
if(obj===null) return null
if(obj instance Date) return new Date(obj)
if(obj instance RegExp) return RegExp(obj)
let newObj = {}
for(var i in obj){
newObj[i] = obj[i]
}
return newObj
}
let a = shallowColne(obj)
a.b.age = 55
console.log(obj) //{name:'你好',b:{age:55}}
複製代碼
let obj = {name:'你好',b:{age:25}}
function deep(obj){
let newObj = {}
if(obj === null) return null
if(obj === Date) return new Date(obj)
if(obj === RegExp) return new RegExp(obj)
if(typeof(obj) != 'object') return obj
for (var i in obj){
newObj[i] = deep(obj[i])
}
return newObj
}
複製代碼
div{
border: 1px solid red;
transform: rotate(45deg)
}
複製代碼
div{
width: 0
height: 0
border: 100px solid
border-color: transparent yellow transparent transparent
}
複製代碼
<div class= 'main'>
<div class= 'left'></div>
<div class= 'right'></div>
</div>
複製代碼
.main{
overflow:hidden
width:100%
height:100%
}
.left{
height:100%
width:250px
float:left
background:red
}
.right{
height:100%
width:calc(100% - 250px)
float:left
background:yellow
}
複製代碼
.main{
overflow:hidden
width:100%
height:100%
}
.left{
height:100%
width:250px
float:left
background:red
}
.right{
width:100%
height:100%
margin-left:250px
background:yellow
}
複製代碼
.main{
overflow:hidden
width:100%
height:100%
}
.left{
height:100%
width:250px
position:absolute
background:red
}
.right{
width:100%
height:100%
float:right
background:yellow
}
複製代碼
.main{
display:flex
width:100%
height:100%
}
.left{
height:100%
width:250px
background:red
}
.right{
height:100%
flex:1
background:yellow
}
複製代碼
.main{
position;relative;
padding: 0 250px
}
.left{
height:100%
width:250px
background:red
position:absolute
top:0
left:0
}
.right{
width:250px
height:100%
background:yellow
position:absolute
top:0
right:0
}
複製代碼
.main{
overflow:hidden
width:100%
height:100%
}
.left{
height:100%
width:250px
float:left
background:red
}
.right{
height:100%
width: 250px
float:left
background:yellow
}
.center{
height:100%
float:left
width:calc(100% - 500px)
background:blue
}
複製代碼
let arr = [11, 2, 3, 4, 2, 1, 5, 2, 56, 5];
let ary = [];
arr.forEach((item) => {
if (ary.indexOf(item) === -1) {
ary.push(item);
}
});
console.log(ary);//[11, 2, 3, 4, 1, 5, 56]
複製代碼
let arr = [11, 2, 3, 4, 2, 1, 5, 2, 56, 5];
let ary = {};
let a = [];
arr.forEach((item) => {
ary[item] = 1;
});
Object.keys(ary).forEach((item) => {
a.push(Number(item));
});
console.log(a);//[11, 2, 3, 4, 1, 5, 56]
複製代碼
let arr = [11, 2, 3, 4, 2, 1, 5, 2, 56, 5];
let a = new Set(arr)
let b = Array.from(a)
console.log(b)//[11, 2, 3, 4, 1, 5, 56]
複製代碼
名字:${name}
let obj = {name:45,age:56}
let a = Object.assign(obj)
a.name = 85
console.log(obj) // {name:85,age:56}
複製代碼
let str = "www.baodu.com?name=12&age=13";
let obj = {};
function getData(a) {
let ary = a.split("?");
let b = ary[1].split("&");
console.log(b);
b.forEach((item) => {
let c = item.split("=");
obj[c[0]] = c[1];
});
console.log(obj);
}
getData(str);
複製代碼
function add(...arg) {
let a = [...arg];
return function(b) {
a.push(b);
return a.reduce((total, item) => {
return total + item;
});
};
}
console.log(add(1)(2));//3
複製代碼
function fn(obj){
this.name = obj
console.log(obj)
}
new fn()
複製代碼
Function.prototype.myBind = function(){
//這裏面的this確定是須要更改的函數,由於fn.myBind(),this == fn
let f = this
return
}
複製代碼
let obj = { name: 15 };
let obj2 = { age: 5 };
function a() {
console.log(this);
}
let b = a.bind(obj).bind(obj2);
b()// 返回的時第一次bind的this
複製代碼
let obj = {name: 15, age: 16}
Function.prototype.myCall(){
let [context,...args] = arguments
if(!context){
context = window
}
context.fuc = this
let res = context.fuc(...args)
delete context.fuc
return res
}
function fn(...args){
return args.reduce((total,item)=>{
return total+item
})
}
fn.myCall(obj,1,2,3)
複製代碼
Function.prototype.myApply = function (){
let [contxt,...args] = arguments
context.fuc = this || window
let res = context.fuc(...args)
delete context.fuc
return res
}
複製代碼
<div @click='fn' ref='str'>{{str}}</div>
data(){
return {
str:35
}
}
methods:{
fn(){
this.str = '你好'
console.log(this.$refs[str].innerHTML)// 35
}
}
複製代碼
created(){
this.$nextTick(()=>{
console.log(this.$refs[st].innerHTML = '小丑竟是你本身')
})
}
複製代碼
<div @click='fn' ref='str'>{{str}}</div>
data(){
return {
str:35
}
}
methods:{
fn(){
this.str = '你好'
this.$nextTick(()=>{
console.log(this.$refs[str].innerHTML)// 你好
})
}
}
複製代碼
let flg = true
function throttle(fn,delay=500){
return (...args)=>{
if(!flg) return
flg = false
setTimeout(()=>{
flg = truw
},delay)
fn.apply(this,args)
}
}
複製代碼
let timer = null
function debounce(fn,delay=500){
return (...args)=>{
if(timer){
clearTimeout(timer)
}
setTimeout(()=>{
fn.aplly(this,args)
},delay)
}
}
複製代碼
<div v-fous = 'fn'></div>
複製代碼
<script>
Vue.diretive('fous'{
inserted:function(el,fuc){
console.log(el,fuc.value)
//el dom元素; fuc.value返回的是fn函數體
}
})
methods:{
fn(){
console.log(11111)
}
}
</script>
複製代碼
export default = {
directiveds:{
fous:{
inserted:function(el,fuc){
console.log(el,fuc.value)
}
}
}
}
複製代碼
formDate.append('屬性名','屬性值')
formdata.get('屬性名')
formData.set('屬性名','屬性值')
formData.has('屬性名')
formData.delete('屬性名')
transform轉換vue
transition過分vue-router
border-radius圓角vuex
box-shadow 陰影npm
僞類選擇器canvas
僞元素選擇器後端
calc函數數組
animations瀏覽器