vue设计之初是为了提高HTML的灵活性,让html更强大。我们传统的html修改标签属性的时候需要需要获取当前的dom然后再进行修改,这样增加了我们的的专注力,我们更希望专心搞一些业务,所以vue通过指令解决这些问题。
在讲解vue指令的时候,我们首先引入vue.js ,详情看官网https://cn.vuejs.org/v2/guide/installation.html#CDN,其次我们需要获得Vue对象,然后把Vue对象挂载到html元素上面(这里的元素必须是最外层),至此我们就可以使用Vue了。这里简要介绍下vue怎么挂载到html的
创建Vue对象的时候参数使用一个json对象,json对象里面有很多options,我们常用的有el(绑定的html元素)、data(vue进行数据交互的数据),methods(方法)等等
1、{{}}
模板:模板的作用修改的是文本节点的内容,注意{{}}内是变量或者表达式
<body><div id="root"><p>{{a}}</p><p>{{c+b}}</p><p>{{fn(11,11)}}</p></div></body><script>var vm = new Vue({el: "#root",data: {a: 'tao',b: 18,c: 18},methods: {fn(num1, num2) {return num1 * num2;}}})</script>
2.修改元素属性 —-v-bind
属性的值可以为变量也可以为表达式
<body><div id="root" :title="name"><p :title ="fn(11,11)"></p>{{name}}</div><script>let vm=new Vue({el: '#root',data: {name: 'taowuhua',a: 22,b: 55,},methods: {fn(num1, num2){return num1*num2;}}});</script>

上面给div的title属性前面增加了v-bind:之后,此时的title就可以进行单向通信了,当修改数据name的时候,title就会发生变化,这无形之中增大了HTML的功能
注意:v-bind:可以省略为:
3、双向绑定——-v-model
<body><div id="root"><input type="text" v-model="name">{{name}}</div><script>let vm = new Vue({el: '#root',data: {name: 'taowuhua',a: 22,b: 55,},methods: {fn(num1, num2) {return num1 * num2;}}});</script></body>
修改数据视图改变,修改视图数据改变。这样真正做到了双向绑定。
4、v-html
适合渲染一段html,或者为了提高前端加载的速度使用服务端渲染的方式,服务端返回一段HTML
<body><div id="root"><p type="text" v-html="name"></p></div><script>let vm = new Vue({el: '#root',data: {name: 'taowuhua<strong>你好</strong>',}});</script></body>
5、判断条件是否true、false加载某些标签———v-if
<body><div id="root"><button @click="fn()">{{text}}</button><div v-if="show">{{visible}}</div><div v-if="!show">{{inVisible}}</div></div></body><script>var vm = new Vue({el: "#root",data: {show: true,text: '切换',visible: '显示',inVisible: '隐藏'},methods: {fn() {this.show = !this.show}}})</script>
6、v-for
哪里需要循环遍历就在哪里使用v-for,类似js的forIn
例一:
<body><div id="root"><ul><li v-for="(item,key) in arrayList ">{{item}}</li></ul><div style="width: 100vw;height: 2px;background: black;"></div><ul><li v-for="(item,key ) in jsonList ">{{item}}</li></ul></div></body><script>var vm = new Vue({el: "#root",data: {arrayList: ["张三", "李四", "王五",],jsonList: {a: "zhangsan",b: "lisi",c: "wangwu",}}})</script>

例二:
二维数组
<body>
<div id="root">
<ul>
<li v-for="arr2 in arrayList ">
<div v-for="item in arr2 ">{{item}}</div>
</li>
</ul>
</div>
</body>
<script>
var vm = new Vue({
el: "#root",
data: {
arrayList: [
[1, 2, 3],
[5, 6, 7],
[8, 9, 10]
]
}
})
</script>
注意:基于vue底层框架使用的jsdifinproperty,导致Json的增加和删除、array的修改、Object.assign、数据不能进行双向绑定,也可以理解为vue的bug,我们需要使用$set解决
<body>
<div id="root">
<ul>
<li v-for="item in arr">{{item}}</li>
</ul>
</div>
<script>
let vm=new Vue({
el: '#root',
data: {
arr: [12,5,8,99,27],
},
});
vm.$set(vm.arr,1,999);
</script>
</body>
Json:
<body>
<div id="root">
<ul>
<li v-for="item in json">{{item}}</li>
</ul>
</div>
<script>
let vm = new Vue({
el: '#root',
data: {
json: {
'a': "zhangsan",
'b': "lisi",
'c': "wangwu",
}
},
});
vm.$set(vm.json, 'd', '我增加了一个');
vm.$set(vm.json, 'a', '我修改了一个');
</script>
</body>
对于Object.assign
Object.assign({}, this.json, {c: 99, d: 88});
7、v-cloak
隐藏未编译的 Mustache 标签直到实例准备完毕,比如网络很慢的时候vue加载会把某些数据显示出来,影响美观。使用[v-cloak] {display:none;}解决
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" charset="utf-8"></script>
<style media="screen">
*[v-cloak] {display:none;}
</style>
</head>
<body>
<div id="root" v-cloak>
{{a}}, {{b}}
</div>
<script src="http://localhost:8080/xxx" charset="utf-8"></script>
<script>
let vm=new Vue({
el: '#root',
data: {
a: 12, b: 5
},
methods: {
fn(){
this.json=Object.assign({}, this.json, {c: 99, d: 88});
}
}
});
</script>
</body>
8、v-pre 指令会跳过此元素及其所有子元素的编译,把标签里的数据都按普通文本解析
<body>
<div id="root">
<div class="" v-pre>
{{a}}, {{b}}
</div>
</div>
<script>
let vm=new Vue({
el: '#root',
data: {
a: 12, b: 5
},
methods: {
fn(){
alert('aaa');
},
fn2(){
alert('bbb');
}
}
});
</script>
</body>
