Vue.js

------------------------------- install ---------------------------------------------------- <div id="app"> </div> <script src="lib/vue.js"></script> //三种选择方式 <script> //1 var vm = new Vue( el: #app ); //2 var vm = document.querySelector(#app); var vm = new Vue({ el:app }); //3 var vm = new Vue({}); vm.$mount(#app); console.log(vm.$el); </script>

el不能是html,body元素,只能是单个元素一般用id

插值表达式不能写在内容以外区域

<div id="app"> <ul> <li>第一段内容{{ 12 > 3 ? "啊":"不" }}</li> <li id="{{ 1 + 2 }}"//这是错的,插值表达式不能写在id里>第一段内容{{ 12 > 3 ? "啊":"不" }}</li> <li>第三段内容{{ var num = 100;//这是错的,javascript不能写在内容里 }}</li> </ul> </div> <script src="lib/vue.js"></script> //三种选择方式 <script> //1 var vm = new Vue( el: #app ); //2 var vm = document.querySelector(#app); var vm = new Vue({ el:app }); //3 var vm = new Vue({}); vm.$mount(#app); console.log(vm.$el); </script>

data

index,length无法自动跟新试图 需要用Vue.set()

<div id="app"> <ul> <li>{{ contentArr[0] }}</li> <li>{{ contentArr[1] }}</li> <li>{{ contentArr[2] }}</li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { contentArr: [内容1,内容2, 内容3] } }); </script> --------------------------------- console -------------------------------------------------- Vue.set(vm.contentArr, 0, new content); //vm.contentArr[0] = "new" 这个不work不会跟新视图 //vm.contentArr.length = 0; 这个不work不会清空视图 可以用vm.contentArr.pop()或vm.contentArr.push(插入新的内容);

methods 存储函数

<div id="app"> <ul> <li>{{ title1.split(-).join() }}</li> <li>{{ fn(title1) }}</li> <li>{{ contentArr[2] }}</li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { prefix: "result", title1 = a-b-c-d-e, title2 = x-y-z }, methods: { fn (value) { this.fn1(); this.fn2(); return this.prefix + value.split(-).join(); }, fn1(){ console.log(did 1); }, fn2(){ console.log(did 2); } } }); </script>

指令 v-once

//只生效一次 v-once <div id="app"> <ul> <li>{{ content }}</li> <li v-once>{{ content }}</li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { content = 内容文本 } }); </script> ----------------------------------------console------------------------------------------- vm.content = change// v-once不随这个改变

v-text

<div id="app"> <ul> <li> abc </li> <li v-text = "100"> def </li> <li v-text = "content"> ghi </li> <li v-html = "content1"> ghi </li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { content = 内容文本, content1 = <span>html不会生效,会原封不动的跟新到视图。需要绑定v-html到li</span> } }); </script> ----------------------------------------console------------------------------------------- vm.content = new// ghi 变 new

属性绑定

<div id="app"> <ul> <li> abc </li> <li v-bind = "100"> def </li> <li v-text = "content"> ghi </li> <li v-html = "content1"> ghi </li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { content = 内容文本, content1 = <span>html不会生效,会原封不动的跟新到视图。需要绑定v-html到li</span> } }); </script>

v-bind 一次绑定多个属性。

<div id="app"> <ul> <li> abc </li> <li v-bind = "100"> def </li> <li v-text = "content"> ghi </li> <li v-html = "content1"> ghi </li> <li :class="num+1+2"> ghi </li> <li :class="prefix + num"> ghi </li> <li :class="cls"> ghi </li> <li :class="bool ? cls1 : cls2"> ghi </li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { attrObj: { id: box, title: title, class: clearFix, data-title: sdf } myTitle:mt, prefix: demo, num: 10, cls = q w e//多个类名设置,不常用 cls1: a, cls1: b } }); </script>

class 绑定选择性绑定

<p :class="{ x:isX, y:false, z: true}"></p> <script> var vm = new Vue({ el: #app, data: { isX: true, } }); </script>

数组绑定

<p :class="[a, classB, {c: isC}]"></p> <script> var vm = new Vue({ el: #app, data: { classB: b, isC: true, } }); </script> ------------------------------------------console------------------------------------- vm.isC = false

style绑定

<p :style="styleObj"></p> <script> var vm = new Vue({ el: #app, data: { styleObj: { weight:200px, height:100px, backgroundColor: red, font-size: 30px } } }); </script>

绑定基础样式和特别样式

<p :style=[baseStyle, styleObj1]></p> <script> var vm = new Vue({ el: #app, data: { baseStyle: {}, styleObj1: { weight:200px, height:100px, backgroundColor: red, font-size: 30px } } }); </script>

v-for:设置唯一key属性。

<div id="app"> <ul> <li v-for="(item, index) in arr"> 内容为:{{ item }} 索引为:{{ index }} </li> //arr <li v-for="(value, key, index) in obj"> 内容为:{{ value }} 键为:{{ key }} </li> //obj </ul> <ul> <li v-for="(item, index) in 5"> 内容为:{{ item }}, {{ index }} </li> </ul> </div> <script> new Vue({ el: #app, data: { arr:[1, 2, 3], obj: { content1: 内容1, content2: 内容2, } } }); </script>

设置key属性

<div id="app"> <ul v-if="true"> <li v-for="item in arr" :key="item"> 输入框{{ item }}, <input type="text"></li> <li v-for="(item, index) in itemList" :key="item.id"> 输入框{{ item.value }}, <input type="text"></li> </ul> </div> <script> new Vue({ el: #app, data: { arr:[1, 2, 3], obj: { content1: 内容1, content2: 内容2, }, itemList: [ { id:1, value:1 }, { id:2, value:3 }, { id:3, value:3 } } }); </script> -------------------------------------console------------------------------------------------ vm.arr.reverse() //设置key为item,内容随着倒转,index不倒转 vm.itemList.reverse() //设置key为item.id,内容随着倒转

template

<div id="app"> <ul> <template v-for="item in obj"//template不设置key> {{ item }} <br> </template> </ul> </div> <script> new Vue({ el: #app, data: { arr:[1, 2, 3], obj: { content1: 内容1, content2: 内容2, } } }); </script>

v-show 只是display:none v-if元素直接被移除

<p v-if="bool">这是第一个p标签</p> <p v-else-if="bool">这是第二个p标签</p> <p v-else-if="bool">这是第三个p标签</p> <p v-else="bool">这是第四个p标签</p> <script> var vm = new Vue({ el: #app, data: { bool: false } }); </script>

事件处理

<div id="app"> <p>{{ content }}</p> <button v-on:click="content=abc">1</button> <button @click="content=abc">2</button> //common <button @click="fn">3</button> //common <button @click="fn(200, event)">3</button> </div> <script> new Vue({ el: #app, data: { content: 内容1, }, methods: { fn() { this.content = 33333333333; } fn2(value, event){ console.log(value, event); } } }) </script>

v-model 复选框绑定

<div id="app"> <p>{{ value }}</p> <p>单个复选框的值{{ value3 }}</p> <p>多个复选框的值{{ value4 }}</p> <input type="text" v-model="value"> <textarea v-model="value1"> <input type="radio" id="one" value="1" v-model="value2"> <label for="one">选项1</label> <input type="checkbox" value="选项内容" id="two" v-model="value3"> <label for="two">选项内容</label> <input type="checkbox" value="选项1" id="1" v-model="value4"> <label for="1">选项1</label> <input type="checkbox" value="选项2" id="2" v-model="value4"> <label for="2">选项2</label> <input type="checkbox" value="选项3" id="3" v-model="value4"> <label for="3">选项3</label> <p>{{ value5 }}</p> <select v-model="value5"> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> <p>{{ value6 }}</p> <select v-model="value6" multiple> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> </div> <script src="lib/vue.js"></script> <script> var vm = new Vue({ el: #app, data: { value: , value: 1, value2: , value3: , value4: [], value5: , value6: [] } }) </script> ------------------------------------console------------------------------------------------ vm.value = 123

选择框绑定

<div id="app"> <p>{{ content }}</p> <button v-on:click="content=abc">1</button> <button @click="content=abc">2</button> //common <button @click="fn">3</button> //common <button @click="fn(200, event)">3</button> </div> <script> new Vue({ el: #app, data: { content: 内容1, }, methods: { fn() { this.content = 33333333333; } fn2(value, event){ console.log(value, event); } } }) </script>

修饰符

事件修饰符 .prevent event.preventDefault() 阻止跳转到链接

<div id="app"> <a @click.prevent="fn" href=https//:....>链接</a> <a @click.prevent href=https//:....>链接</a> </div> <script> new Vue({ el: #app, data: { }, methods: { fn() { console.log(这是a标签的点击事件); } } }) </script>

阻止冒泡给父元素

写文章草稿保存中…邀请预览发布------------------------------- install ---------------------------------------------------- <div id="app"> </div> <script src="lib/vue.js"></script> //三种选择方式 <script> //1 var vm = new Vue( el: #app ); //2 var vm = document.querySelector(#app); var vm = new Vue({ el:app }); //3 var vm = new Vue({}); vm.$mount(#app); console.log(vm.$el); </script>el不能是html,body元素,只能是单个元素一般用id插值表达式不能写在内容以外区域<div id="app"> <ul> <li>第一段内容{{ 12 > 3 ? "啊":"不" }}</li> <li id="{{ 1 + 2 }}"//这是错的,插值表达式不能写在id里>第一段内容{{ 12 > 3 ? "啊":"不" }}</li> <li>第三段内容{{ var num = 100;//这是错的,javascript不能写在内容里 }}</li> </ul> </div> <script src="lib/vue.js"></script> //三种选择方式 <script> //1 var vm = new Vue( el: #app ); //2 var vm = document.querySelector(#app); var vm = new Vue({ el:app }); //3 var vm = new Vue({}); vm.$mount(#app); console.log(vm.$el); </script>dataindex,length无法自动跟新试图 需要用Vue.set()<div id="app"> <ul> <li>{{ contentArr[0] }}</li> <li>{{ contentArr[1] }}</li> <li>{{ contentArr[2] }}</li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { contentArr: [内容1,内容2, 内容3] } }); </script> --------------------------------- console -------------------------------------------------- Vue.set(vm.contentArr, 0, new content); //vm.contentArr[0] = "new" 这个不work不会跟新视图 //vm.contentArr.length = 0; 这个不work不会清空视图 可以用vm.contentArr.pop()或vm.contentArr.push(插入新的内容);methods 存储函数<div id="app"> <ul> <li>{{ title1.split(-).join() }}</li> <li>{{ fn(title1) }}</li> <li>{{ contentArr[2] }}</li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { prefix: "result", title1 = a-b-c-d-e, title2 = x-y-z }, methods: { fn (value) { this.fn1(); this.fn2(); return this.prefix + value.split(-).join(); }, fn1(){ console.log(did 1); }, fn2(){ console.log(did 2); } } }); </script>指令 v-once//只生效一次 v-once <div id="app"> <ul> <li>{{ content }}</li> <li v-once>{{ content }}</li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { content = 内容文本 } }); </script> ----------------------------------------console------------------------------------------- vm.content = change// v-once不随这个改变v-text<div id="app"> <ul> <li> abc </li> <li v-text = "100"> def </li> <li v-text = "content"> ghi </li> <li v-html = "content1"> ghi </li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { content = 内容文本, content1 = <span>html不会生效,会原封不动的跟新到视图。需要绑定v-html到li</span> } }); </script> ----------------------------------------console------------------------------------------- vm.content = new// ghi 变 new属性绑定<div id="app"> <ul> <li> abc </li> <li v-bind = "100"> def </li> <li v-text = "content"> ghi </li> <li v-html = "content1"> ghi </li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { content = 内容文本, content1 = <span>html不会生效,会原封不动的跟新到视图。需要绑定v-html到li</span> } }); </script>v-bind 一次绑定多个属性。<div id="app"> <ul> <li> abc </li> <li v-bind = "100"> def </li> <li v-text = "content"> ghi </li> <li v-html = "content1"> ghi </li> <li :class="num+1+2"> ghi </li> <li :class="prefix + num"> ghi </li> <li :class="cls"> ghi </li> <li :class="bool ? cls1 : cls2"> ghi </li> </ul> </div> <script> var vm = new Vue({ el: #app, data: { attrObj: { id: box, title: title, class: clearFix, data-title: sdf } myTitle:mt, prefix: demo, num: 10, cls = q w e//多个类名设置,不常用 cls1: a, cls1: b } }); </script>class 绑定选择性绑定<p :class="{ x:isX, y:false, z: true}"></p> <script> var vm = new Vue({ el: #app, data: { isX: true, } }); </script>数组绑定<p :class="[a, classB, {c: isC}]"></p> <script> var vm = new Vue({ el: #app, data: { classB: b, isC: true, } }); </script> ------------------------------------------console------------------------------------- vm.isC = falsestyle绑定<p :style="styleObj"></p> <script> var vm = new Vue({ el: #app, data: { styleObj: { weight:200px, height:100px, backgroundColor: red, font-size: 30px } } }); </script>绑定基础样式和特别样式<p :style=[baseStyle, styleObj1]></p> <script> var vm = new Vue({ el: #app, data: { baseStyle: {}, styleObj1: { weight:200px, height:100px, backgroundColor: red, font-size: 30px } } }); </script>v-for:设置唯一key属性。<div id="app"> <ul> <li v-for="(item, index) in arr"> 内容为:{{ item }} 索引为:{{ index }} </li> //arr <li v-for="(value, key, index) in obj"> 内容为:{{ value }} 键为:{{ key }} </li> //obj </ul> <ul> <li v-for="(item, index) in 5"> 内容为:{{ item }}, {{ index }} </li> </ul> </div> <script> new Vue({ el: #app, data: { arr:[1, 2, 3], obj: { content1: 内容1, content2: 内容2, } } }); </script>设置key属性<div id="app"> <ul v-if="true"> <li v-for="item in arr" :key="item"> 输入框{{ item }}, <input type="text"></li> <li v-for="(item, index) in itemList" :key="item.id"> 输入框{{ item.value }}, <input type="text"></li> </ul> </div> <script> new Vue({ el: #app, data: { arr:[1, 2, 3], obj: { content1: 内容1, content2: 内容2, }, itemList: [ { id:1, value:1 }, { id:2, value:3 }, { id:3, value:3 } } }); </script> -------------------------------------console------------------------------------------------ vm.arr.reverse() //设置key为item,内容随着倒转,index不倒转 vm.itemList.reverse() //设置key为item.id,内容随着倒转template<div id="app"> <ul> <template v-for="item in obj"//template不设置key> {{ item }} <br> </template> </ul> </div> <script> new Vue({ el: #app, data: { arr:[1, 2, 3], obj: { content1: 内容1, content2: 内容2, } } }); </script>v-show 只是display:none v-if元素直接被移除<p v-if="bool">这是第一个p标签</p> <p v-else-if="bool">这是第二个p标签</p> <p v-else-if="bool">这是第三个p标签</p> <p v-else="bool">这是第四个p标签</p> <script> var vm = new Vue({ el: #app, data: { bool: false } }); </script>

事件处理

<div id="app"> <p>{{ content }}</p> <button v-on:click="content=abc">1</button> <button @click="content=abc">2</button> //common <button @click="fn">3</button> //common <button @click="fn(200, event)">3</button> </div> <script> new Vue({ el: #app, data: { content: 内容1, }, methods: { fn() { this.content = 33333333333; } fn2(value, event){ console.log(value, event); } } }) </script>

v-model 复选框绑定

<div id="app"> <p>{{ value }}</p> <p>单个复选框的值{{ value3 }}</p> <p>多个复选框的值{{ value4 }}</p> <input type="text" v-model="value"> <textarea v-model="value1"> <input type="radio" id="one" value="1" v-model="value2"> <label for="one">选项1</label> <input type="checkbox" value="选项内容" id="two" v-model="value3"> <label for="two">选项内容</label> <input type="checkbox" value="选项1" id="1" v-model="value4"> <label for="1">选项1</label> <input type="checkbox" value="选项2" id="2" v-model="value4"> <label for="2">选项2</label> <input type="checkbox" value="选项3" id="3" v-model="value4"> <label for="3">选项3</label> <p>{{ value5 }}</p> <select v-model="value5"> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> <p>{{ value6 }}</p> <select v-model="value6" multiple> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> </div> <script src="lib/vue.js"></script> <script> var vm = new Vue({ el: #app, data: { value: , value: 1, value2: , value3: , value4: [], value5: , value6: [] } }) </script> ------------------------------------console------------------------------------------------ vm.value = 123选择框绑定

点击事件绑定

<div id="app"> <p>{{ content }}</p> <button v-on:click="content=abc">1</button> <button @click="content=abc">2</button> //common <button @click="fn">3</button> //common <button @click="fn(200, event)">3</button> </div> <script> new Vue({ el: #app, data: { content: 内容1, }, methods: { fn() { this.content = 33333333333; } fn2(value, event){ console.log(value, event); } } }) </script>

once 一次

<div id="app"> <button @click.once="fn">按钮</a>//只会打印一次。。不管点多少次 <div> </div> <script> new Vue({ el: #app, data: { }, methods: { fn() { console.log(一次性的); } } }) </script>

修饰符事件修饰符 .prevent event.preventDefault() 阻止跳转到链接

<div id="app"> <a @click.prevent="fn" href=https//:....>链接</a> <a @click.prevent href=https//:....>链接</a> </div> <script> new Vue({ el: #app, data: { }, methods: { fn() { console.log(这是a标签的点击事件); } } }) </script>阻止冒泡给父元素d> <style> #app { width:100px; height:100px; border:1px solid grey; } </style> </head> <body> <div id="app" @click="fn"> <div> <button @click="fn1">按钮</a> <div> </div> <script> new Vue({ el: #app, data: { }, methods: { fn() { console.log(这是块); } fn1() { console.log(这是按钮); } } }) </script> </body>

阻止父元素,阻止链接的传递写法

<style> #app div { width:100px; height:100px; border:1px solid grey; } </style> </head> <body> <div id="app"> <div @click="fn"> <a @click.prevent.stop="fn1" href="#">按钮</a>//阻止父元素,阻止链接 <div> </div> <script> new Vue({ el: #app, data: { }, methods: { fn() { console.log(这是块); } fn1() { console.log(这是按钮); } } }) </script> </body>

按键码

<input type="text" @keyup.a="fn"> //keyup.65也可以 <input type="text" @keyup.esc="fn"> //enter,page-down,tab...... <input type="text" @keyup.a.b.c="fn"> //a或b或c都可以出发

系统修饰符

<input type="text" @keyup.17.q="fn">//单独ctrl 或 q 触发 ...... fn1(event) { console.log(event); }

CTRL+q触发 清空效果

<input type="text" @keyup.ctrl.q="fn" v-model="value">//单独ctrl 或 q 触发 ...... <script> new Vue({ el: #app, data: { value: "" }, methods: { fn() { this.value = "" } } }) </script>

左键中键右键

<button @click.left ="fn">sdf</button>

.trim .lazy失去焦点检测再跟新。不需要实施跟新。.number 字符串转数字等同于parseFloat

<div id="app"> <input type="text" v-model.trim="inputValue"> <p>{{ inputValue }}</p> </div> <script> new Vue({ el: #app, data: { }, methods: { var vm = new Vue( { el: #app, data: { inputValue: } }); </script>

自定义指令

全局

<div id="app"> <input type="text" v-focus> </div> <div id="app1"> <input type="text" v-focus> //会聚焦到这里,光标只有一个 </div> <script> Vue.directive(focus, { inserted(el, binding) { console.log(binding); el.focus(); } } new Vue({ el: #app, data: { }, }); new Vue({ el: #app1, data: { }, }); </script>

局部指令

new Vue({ el: #app1, data: { }, directives: { focus: { inserted (el) { el.focus(); } } } });

过滤器也有全局和局部.局部和全局重名,局部生效。

<div id="app"> <div v-bind:title="value | filterA"></div> <div>{{ value1 | filterA }}</div> </div> <script> Vue.filter(filterA, function(value){ return value.split(-).join(); }); new Vue({ el: #app, data: { value: a-b-c, value1: x-y-z } }); </script>

computed缓存结果,method每次都会执行程序。