> 慢慢增加,慢慢从有道迁过来 #### 绑定和渲染 1. 数据绑定 > {{message}}
只绑定一次 {{*message}} 2. 双向绑定 > {{message}} 3. 绑定表达式 > {{message?message:”init data”}} 4. 绑定HTML标签 >
5. v-show(操作的是样式,不支持template) >
hello
6. v-if(操作的是DOM) >
world
7. v-else(跟在v-if或v-else后面) 8. v-for >
- {{item}}
- {{index}}{{item}}
- {{ index }}. {{ key }} : {{ value }}
- v-bind
link
实例方法
- 在实例创建后,挂载以前不存在的属性,是不会刷新视图的
vm.$el
–>是一个HTML元素节点,即vm的el属性vm.$data
–>可以直接更改对象数据vm.$watch()
–>监听数据变化
生命周期属性
created
-> 先实例化,在实例化后(检测el)vm.$mount('#app')
-> 手动挂载实例beforeCompile
-> 开始编译之前compiled
-> 编译完成之后ready
-> 插入文档后vm.$destroy()
-> 手动销毁实例beforeDestroy
-> 将要销毁destroyed
-> 销毁实例
计算属性
computed:{ sum:function(){ return this.price*this.count } }
双向绑定,在一个input里面写count,最终价格实时更新在视图
computed:{ sum:{ get(){ return this.price*this.count }, set(val){ this.price = val } } }
解决闪烁
<div v-text="message"></div>
- 推荐用 ↓
[v-cloak]{ display:none; } <div v-cloak> {{message}} </div>
事件绑定
<div v-on:click="add"></div> <div @click="add"></div>
- 需要传参的时候 add后面要跟(),即add(1,$event,2)
methods:{ add:function(e){ console.log(e) } }
- 删除数组元素
remove:function(book){ this.books.$remove(book) }
- 阻止冒泡
<div @click.stop="child">child</div>
- 阻止默认动作
<div @click.prevent="child">child</div>
- 事件只绑定在自己身上
<div @click.self="child">child</div>
- 键盘事件
@keyup.enter="method"
- 延迟事件
@keyup="make | debounce 1000"
单位是毫秒 - 限制条数和从第几条开始显示
v-for="arr in arr1 | limitBy 3 2"
- 过滤数据
v-for="arr in arr1 | filterBy 'zfpx1'" //默认是从所有属性中筛选 v-for="arr in arr1 | filterBy 'zfpx1' in 'name' " //指定从哪个属性中进行筛选
- 排序
v-for="arr in arr1 | orderBy 'name' -1" -> 倒序
样式绑定
- 优雅绑定
:class
->动态绑定
- 普通,样式名
<div :class="class1">123</div>
- 对象语法
<div :class="{class1:true,class2:false}">123</div>
或者直接放个对象进去:class="classObject"
(classObject:{‘bg-danger’:true,’text-primary’:true}) - 数组绑定
<div :class="[class1,class2]">123</div>
数组里面的元素渲染到页页上去的字符串 -
- -
- 普通,样式名
watch
用于监测数据变化
watch:{ 'name':function(val,oldVal){ alert('新值是:'+val+' 旧值是:'+oldVal) } }
V-model
v-model.trim
-> 清除前后空格v-model.number
-> 把输入内容转成数字v-model.lazy
-> 把同步输入框的值与数据转变为在change事件中同步- 复选框 -> model里面是一个数组
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="mike" v-model="checkedNames">
<label for="mike">Mike</label>
<br>
<span>checked names: {{ checkedNames }}</span>
- 单选框 -> model里面是一个字符串
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<br>
<span>Picked:{{ picked }}</span>
- 单选列表 -> model里面是一个字符串
<select v-model="selected"> <option disabled value="">请选择</option> <option>A</option> <option>B</option> <option>C</option> </select> <span>Selected:{{ selected }}</span>
- 多选列表 -> 绑定在一个数组
<select v-model="multiselected" multiple style="width: 50px;"> <option>A</option> <option>B</option> <option>C</option> </select> <span>选中的{{multiselected}}</span>
组件
注册全局组件
Vue.component('my-component', { // 选项 }) //------------------------------------- <div id="example"> <my-component></my-component> </div> // 注册 Vue.component('my-component', { template: '<div>A custom component!</div>' }) // 创建根实例 new Vue({ el: '#example' }) //---------------------------------------
- 局部组件
var Child = {
template:'<div>A custom component!</div>'
};
new Vue({
el:'#app',
components:{
'my-component':Child
}
})
computed 计算属性
- 有一个get()和set()方法,默认是get
vm.$el
-> 指一个原生的DOM元素
vm.$data
-> 就是实例的data属性
vm.$mount('#box')
-> 手动挂载实例
vm.$options
-> 自定义的属性
vm.$destroy
-> 销毁对象
vm.$log()
-> 查看现在数据的状态过滤器
- debounce -> 延迟执行(自带)
@click="show | debounce 2000" //延迟2秒执行
- limitBy(数组里面用)
v-for="val in arr | limitBy 2 3" //取2个从3开始
- filterBy -> 过滤
v-for="val in arr | filterBy 'o' " // 过滤,只取包含'o'的项 // 可以和v-model结合起来用,比如简单的数据搜索
- orderBy -> 排序
v-for="val in arr | orderBy [按什么排] 1" //正序 v-for="val in arr | orderBy [按什么排] -1" //倒序
- json -> 相当于JSON.stringify()
- 自定义过滤器
Vue.filter(name,function(){ }); // 自定义一个个位数转两位数的过滤器 Vue.filter('toDouble',function(input){ return input<10?'0'+input:''+input; }) // 接收参数的过滤器 Vue.filter('toDouble',function(input,a,b){ alert(1) alert(2) return input<10?'0'+input:''+input; }) // timestamp转具体时间的过滤器 Vue.filter('date',function(input){ var oDate = new Date(input) return oDate.getFullYear()+'-'+(oDate.getMonth()+1)+'-'+oDate.getDate() })
自定义指令
Vue.direction() // 只是 v-red Vue.direction('red',function(el){ // el指原生DOM元素 el.style.background = 'red' }) //v-red // v-red='msg' Vue.direction('red',function(el,msg){ // el是原生DOM元素,msg是传进来的参数,是一个Ojbect el.style.background = 'red' console.log(msg.value) //指参数的值 })
监听数据变化
vm.$watch('a',function(){ //浅度监视 alert('变化了') }) vm.$watch('a',function(){ //深度监视 alert('变化了') },{deep:true})
bower(前端包管理器)
npm install bower -g
bower --version
bower install 包名
bower install vue#1.0.28bower uninstall 包名
bower info 包名
->该包的信息
vue组件
- 定义组件
1. 全局组件 var A = Vue.extend({ template:`hello world` }) Vue.components('aaa',A) <aaa><aaa> ->>>>>>> <hello world> // 组件里面要放数据 var A = Vue.extend({ template:`<h1>{{msg}}</h1>`, data:function(){ return { msg:'hello world' } } }) // 方法同Vue实例 2. 局部组件 var A = Vue.extend({ template:`hello world` }) var vm = new Vue({ el:'#app', data:{ msg:'hello' }, components:{ aaa:A } }) 3. 另一种方式 // 全局 Vue.component('aaa',{ template:`<strong>hello world</strong>` }); var vm = new Vue({ el:'#app' }) // 局部 var vm = new Vue({ el:'#app', components:{ 'aaa':{ template:`<h2>hello world</h2>` } } })
模板
- script方式
<script type="v-template或者其他什么" id="aaa"> // 这是模板内容 </script> template:'#app' //在Vue实例里面这样应用
- template标签方式
<template id="aaa"> // 这里是模板内容 </template> template:'#aaa' //在Vue实例里面这样应用
Vue动态组件
<div id="app"> <input type="button" @click="template_name='aaa'" value="aaa组件"> <input type="button" @click="template_name='bbb'" value="bbb组件"> <component :is="template_name"></component> </div> //js var vm = new Vue({ el:'#app', data:{ template_name:'aaa' }, components:{ 'aaa':{ template:`<h2>hello world!aaa</h2>` }, 'bbb':{ template:`<h2>hello world!bbb</h2>` } } })
父子组件
<div id="app"> <aaa></aaa> </div> // js var vm = new Vue({ el:'#app', data:{ template_name:'aaa' }, components:{ 'aaa':{ template:`<h2>hello world!aaa<bbb></bbb></h2>`, // 所有的元素都必须放在一个根元素里面 components:{ 'bbb':{ template:`<h3>bbb组件</h3>` } } } } }) // 默认情况下,父子组件里面的数据不共享 // 下面是组件间数据传递
组件间数据传递 - 子组件获取父组件的数据
<div id="app"> <aaa></aaa> </div> <template id="aaa"> <h1>11111<bbb :m="msg"></bbb></h1> //这里可以访问到组件属性,把它传给子组件,如果这里传的属性是带 - 的,那在子组件里面接收的时候要换成驼峰法才能被识别出来 </template> //js代码 var vm = new Vue({ el:'#app', data:{ template_name:'aaa' }, components:{ 'aaa':{ data:function(){ return { msg:'我是父组件的数据' } }, template:'#aaa', components:{ 'bbb':{ props:['m'], // 用这个字段来接收父组件传过来的数据 props:{ 'm':String //这是第二种接收方法,value是key的数据类型 } template:`<h3>我是bbb组件->{{m}}</h3>` } } } } })
组件间数据传递 - 父组件获取子组件的数据
<div id="app"> <aaa></aaa> </div> <template id="aaa"> <div> <span>我是父级数据</span><button>按钮</button> <br> <bbb @child_msg="get"></bbb> </div> </template> <template id="bbb"> <div> <span>子组件</span> <button type="button" @click="send">发送</button> </div> </template> // js代码 var vm = new Vue({ el:'#app', data:{ template_name:'aaa' }, components:{ 'aaa':{ data:function(){ return { msg:'我是父组件的数据' } }, template:'#aaa', methods:{ get:function(msg){ alert(msg) } }, components:{ 'bbb':{ data:function () { return{ a:'我是子组件的数据' } }, template:'#bbb', methods:{ send:function(){ this.$emit('child_msg',this.a) } } } } } } })
slot
<div id="app"> <aaa> <h1>这是里面原有的内容</h1> </aaa> </div> <template id="aaa"> <div> <h1>xxxx</h1> <slot>这是默认的内容</slot> //组件内以前原有的内容,如果里面有东西,这句话就不会显示出来 ,如果没有东西,则显示这句默认的话 <p>welcome vue</p> </div> </template> //js代码 var vm = new Vue({ el: '#app', components: { 'aaa': { template: '#aaa' } } })
- v-bind