vue全家桶

 

标签篇

<template></template>无意义标签

<component :is="组件名"></component>该组件替代

 

指令篇

值是引号,引号里面是变量:

v-model 

  仅用于input textareas select表单元素,忽略表单元素的value,checked,selected属性,有后两项属性的表单标签,需加value属性;

<input type="checkbox" v-model="b" value="游泳"/>
<input type="checkbox" v-model="b" value="吃饭"/>
<input type="checkbox" v-model="b" value="睡觉"/>
      {{b}}


data:{b:[]}
//点击哪个,就会把那个的value添加到或删除到了数组中

 

源码通过Object.defineProperty的get和set方法来实现视图层和数据层的双向绑定。

  手工实现v-model原理

  

            let obj={};
            let temp={};
            Object.defineProperty(obj,'name',{
               
                get(){
                    return temp.name
                },
                set(val){
                    temp.name=val;
                    
                }
            }    

 

v-if控制元素有无/v-show控制样式显示隐藏

v-else-if

v-else

三种指令必须挨着,才能构成逻辑判断

<div v-if="false">123</div>
<div v-else-if="false">elseifdeuyu</div>
<div v-else>333</div>
<button @click="cut=!cut">单</button>
        <template v-if="cut">
            <label>注册</label>
            <input type="text" key="1"/>
        </template>
        <template v-else>
            <label>登陆</label>
            <input type="text" key="2"/>
        </template>

template标签不支持v-show指令

 

v-bind属性绑定,简写: 表示字符串内的为变量

 绑定class和style属性有两种方式

对象的方式和数组的方式

.style1{
        background: yellow
    }
    .style2{
        color:red;
    }
    .style3{
        font-size: 30px;
    }


<div :class="['style1','style2']">以数组的方式</div>
<div :class="{style1:cut,style2:cut2,style3:cut3}" >以对象的方式</div> 
data:{ cut:true, cut2:false, cut3:false, }
 
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
 

 

v-for 哪个标签需要循环就给那个标签加v-for="(item,index) in obj" 第一个参数是item,第二个是index

v-text 可以解决以{{}}小胡子写法的页面刚加载时一闪而过出现{{}}的尴尬,v-text是把变量编译好了的数据

v-html

v-cloak

v-once

  表示view层只变化一次,显示第一次的数据,不论model数据层变化了多少次,如:

<div v-once>{{msg}}</div>
<input type="text" v-model='msg' />

 

v-on简写@ 事件名.修饰符.修饰符

  双击事件dblclick

   键盘事件 如@keyup.ctrl.a="fn" 或@keyup.ctrl.a="fn()",写成函数定义或调用都可以 表示同时按住ctrl键和a键 触发fn函数,

   事件会自动给fn传递event参数:

    methods里的fn(e){}

  如何传递其他参数:@click=““fn($event,其他参数)””

   事件的修饰符:

  .stop停止冒泡,.capture捕获,.self event的target是它时才触发,.once只触发一次,.prevent阻止默认事件

 {{}}可以写表达式,赋值运算 三元表达式 计算。 this指代vm, this.person 可以不写this

 如 :{{'hello' | handle}}会将hello作为参数传给实例里的filters里的handle函数

 

 

实例篇

 

vm会代理data,methods,computed,变量名不能重名,因为都是vm对象上的属性,可通过vm.person访问,通过vm.$set(vm.person,key值,value值)可以设置对象。

数据劫持:vue会遍历data里的对象,给之加上getter,setter(get set方法),使之可以双向数据绑定

 

let vm=new Vue({

  el:挂载点,(vue的作用范围,源码使用querySelector方法)

  data:{

    person:{}

  },

  methods:{

    函数的this指向vm实例,不能用箭头函数写法,因为箭头函数里的this就是指向上一级作用域了

  },

  filters:{//函数只能在该挂载点范围内有效,如想在全局有效则在 new vue之前给原型加方法 // Vue.filter('handle',(data)=>{return data+'handle'})

    handle(data){

      return data+‘handle’

      }

  }

  computed:{

    属性名:{//属性名可以直接用

      get(){

        return值

      },

      set(val){

      }

    },

    属性名(){

      return 值

      //写成这种方式,默认没有set,只有get

    }

  watch:{

    属性名(newval,oldval){//监听该属性,变化了就执行该函数

    }

  },

  directives:{//创建指令 使用:v-指令名

    指令名(el,bindings){//将绑定该属性的元素作为参数传给第一个函数,绑定的东西传给第二个参数

    }

  },

  components:{

    子组件名:{

      template:''标签或是'#id'

          (将<template id='id'>

            <slot></slot>

            <slot name=''></slot>

          </template>写到html中 模板用到slot表示组件的innerHTML内可以加标签,标签有slot属性,值与name对应 )

 

      data(){

        return 对象

        }

      }    

  },

  props:{

    属性名:{

      type:[Number,Boolean,Array,String,Object],//多类型或单类型

      default:()=>{return []},//需要是函数 返回值形式

      validator(val){

        return 真假值

        }

  }

  }//或数组 用于父传子通信

}

});

全局组件

Vue.component('组件名',{

  template:

  ....

})

 生命周期的钩子函数

 

let vm = new Vue({
     
      beforeCreate(){//初始化内部的方法
          console.log(this,'bc')
      },
      data:{
         flag:'red',
         a:123,
         attr:[3,4,5]
         
      },
      created(){//初始化data等 请求数据
          console.log(this,'c')
      },
      beforeMount(){//没用

      },

      //template:'<div id="self">{{flag}}</div>',模板 如没有则用挂载点 有则用该模板
      mounted(){//真实dom渲染完成
        console.log('------------')
        console.log(this.$refs.choose);
       
        this.$nextTick(()=>{
            this.attr=[1,1,1,1,1]
            console.log(this.$refs.choose);
        })
        
        
      },
      beforeUpdate(){//一般用watch来替代
        console.log('更新之前')
      },
      updated(){//一般用watch来替代
        console.log('更新了')
      },
      beforeDestroy(){//清除定时器 解除事件绑定
        console.log('销毁前')
      },
      destroyed(){
        console.log('销毁')
      }
    
  }).$mount('#app') //等同于el:'#app',
  vm.$destroy();

 

 实例方法

//this.$data this.$watch this.$el this.$set  this.$options
//this.$nextTick 异步等待DOM挂载完成
// this.$refs.choose 得到数组,如果多个ref='choose'元素 不是通过v-for循环得来的,则只会获取到一个
<p ref="choose" v-for="item in attr"></p>

 通信篇

1,父传子:通过绑定属性

2,子传父:(有一种情况子可以直接修改父的props,那就是父传子的是obj类型,子修改obj则父的obj也变了)

给父组件加上绑定事件@事件名='函数',就会有内置的.$on('事件名',function(接收传递的数据){}),

子组件通过 .$emit('事件名',要传递的数据)触发事件,来传递数据。

3,跨组件间通信:

let eventBus=new Vue();
事件车,将所有用于通信的事件绑定到该实例上
通过$emit和$on来触发监听

 4,vuex

 新建vuex目录:

1)state.js保存状态的文件 :export default 状态对象

2)mutations-type.js用来集中定义事件名的文件:export const 事件名='事件名'

3)mutations.js保存action的文件:

  import * as types from './mutations-type.js'

  export default 事件函数对象如

  fn(state,传参){state是状态对象}或

  [types.名字](){}

 

4)getters.js保存计算属性对象:

属性名:(state)=>{return }

 

5)index.js:

import Vue from 'vue'
import Vuex from 'vuex';
Vue.use(Vuex);

import state from './state.js';
import mutations from './mutations.js';
import getters from './getters.js';

let store=new Vuex.Store({
  state,
  mutations,
  getters
})
export default store;

在主文件的new Vue({

store,//将存储放在实例里

})

 

使用方法:

import {mapState,mapMutations,mapGetters} from 'vuex';
import * as Types from '' methods:{   ...mapMutations([对应的事件名])
//console.log(mapMutations([对应的事件名]))的值是对象,里面有key事件名,value函数体   其他函数可使用该函数并传参,例如edit(参数){this[Types.名字](参数)} } computed:{   ...mapState([对应的状态名])//返回结果同上 名字是state.js里保存的变量名   ...mapGetters([对应名])//返回结果同上 名字是state.js里保存的变量名
 }

 

 实例的方法$emit、$on、$refs

 

 

 路由篇

  router文件夹下index.js配置路由表

  import Vue from 'vue';
  import Router from 'vue-router';
  Vue.use(Router);//使router全局能用 Vue.use全局


   let router=new Router({
    mode:url访问模式 hash or browser
    linkActiveClass:链接访问的class //更名
    linkExactActiveClass:当前页面的class //更名
    routes: [
      {path:'/path/:变量名/:变量名',
       component:组件名,
       children:[         {path:
'子路径也要写上父路径',component:组件名}        ]
       },
       {
        path:'/detail/:id',
        component:()=>import ('../components/Detail'),//组件拆分,路由按需加载的方式,提升网路访问速度,该函数返回的是promise对象
        name:'detail'
        },        {         path:
'*',redirect:''重定向路径        }     ]   })   new Vue({     router, //将路由放在实例里   })

$route.params.变量名、$router.go(负数)返回第几级,.back()返回上一级,.push(路径)跳到哪里,.replace()替换

 

<router-view></router-view>
<router-link to='/url地址' :to="{name:'detail',params:{id:item.id}}"(动态传地址) tag='哪种标签' exact精确匹配 ></router-link>
 


缓存组件

<keep-alive>
  <要缓存的组件>
</keep-alive>
(组件渲染一次后不会销毁,从而也不会重新渲染)
解决办法:增加生命周期的钩子函数
activated(){
  加了keep-alive会多次执行,不加keep-alive则不执行
}
deactivated(){
   keep-alive移除时调用
}

安装脚手架

npm init -y
npm install vue
vue init webpack 项目名

 

.vue文件模板

  <template></template>
  <script>
    export default {


    }
  </script>
  <style scoped lang="less">规定样式语言</style>

 

App.vue是根组件,用来渲染路由页面<router-view></router-view>

main.js是webpack中 entry打包的文件

安装的外部插件,都在这里引用,全局声明

  import Vue from 'vue';
  import App from './App.vue';
  import router from './router/index.js';
  new Vue({
    el: "#app",
    render:h => h(App),runtime模式
    或template:complier模式,
    router//配置router路由

});

 

dev模式如何改端口号config->index.js,

 

posted @ 2017-10-24 14:45  catalinaScript  阅读(316)  评论(0编辑  收藏  举报