VUE学习笔记
一:创建Vue
1.创建Vue
1.引入vue
<script type="text/javascript" src="../js/vue.js"></script>
2.创建vue
<body>
<div class="root">
<h1>hello,{{name}}</h1>
</div>
<div class="root">
<h1>hello,{{name}}</h1>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el:'.root',//el用于指定vue实例为哪个容器服务,此处找上面id 用# ,找class 用 . 一般用id
data:{
name:'尚硅谷'
}
})
</script>
</body>
3.解释
- 首先引入vue的js文件
- 在div或者其他块元素中设立class或者id,
- 在script中创建new vue,并且用el绑定创建的id,分别用.或者#,data设立数据。
2.模板语法
1.插值语法
指取出data中的数据,{{xxx}}xxx为js表达式
<a :href="www.baidu.com">{{name}}</a>
2.指令语法
格式:a </ a>
同样xxx为js表达式
<a v-bind:href="www.baidu.com">链接</a>
3.数据绑定
单向绑定:v-bind 数据只能从data流向页面
双向绑定:v-model 还可以反过来流
注:双向绑定一般用在表单类元素上,如input、select、textarea等
v-model:value可以简写为v-model
4.el与data的两种写法
el:
- 创建vue时指定el属性
- 先创建实例,再通过vm.#mount(‘#root’)指定
data:
- 对象式:data:{xxx}
- 函数式:daa(){ return { xxx } }
注意vue函数一定不要写箭头函数
5.MVVM模型
M:模型Model
V:视图View
VM:ViewModel,Vue实例
6.数据代理
Object.defineproperty方法
<script type="text/javascript">
let obj1={x:100}
let obj2={y:200}
Object.defineProperty(obj2,'x',{
get(){
console.log("调取get方法")
return obj1.x
},
set(value){
console.log("调取set方法")
obj1.x=value
}
})
</script>
调试结果
obj1
{x: 100}
obj2.x
03数据代理.html:16 调取get方法
100
obj2.y
200
obj1.x=500
500
obj2.x=500
03数据代理.html:20 调取set方法
500
通过数据绑定,将obj1也绑定在obj2上,即也可以使用obj来调用obj1中的属性,并且obj2中修改可读取obj1中的属性时,使用的是obj2针对obj1自己单独的set和get方法,并不是obj1自己的set和get方法
总结:通过一个对象代理对另一个对象中的属性进行操作(读写)
7.事件的处理
1.基本用法
- 使用 v-on : xxx 或者 @xxx绑定事件,其中xxx是事件名
<button v-on:click="showinfo1">点击事件1</button>
<button @click="showinfo1">点击事件2</button>
- 事件的回调需要配置在methods对象中,最终会在vm上
new Vue({
el:'#root',
data:{
name:'李四'
},
methods:{
showInfo1(){
alert("同学你好")
},
showInfo(e){
alert("同学你好")
}
}
- methods中配置的函数,不要使用箭头函数,否则this就不是vm了
- methods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象
- @click="demo"与@click="demo(#event)"效果一样,但是后者可以传参
<button v-on:click="showInfo1">点击提示信息1(不传参)</button>
<button @click="showInfo2(66,$event)">点击提示信息2(传参)</button>
methods:{
showInfo1(){
alert("同学你好")
},
showInfo2(number,a){
console.log(number,a)
alert("同学你好")
}
}
2.事件修饰符
- prevent 阻止默认事件,如href的跳转
- stop 阻止事件冒泡,相同事件多次触发
- once 事件只触发一次
- self 不常用
- passive 不常用
- capture 不常用
<a href="http://www.baidu.com" @click.prevent="showInfo">点击事件</a>
修饰也可以连着写
<a href="http://www.baidu.com" @click.prevent.stop="showInfo">点击事件</a>
3.键盘事件
每一个按键都有自己的编码
-
常用的:enter、delete、esc、space、tab(必须配合keydown使用)、up、down、left、right、
-
vue未提供别名的按键,可以使用原始的key值绑定
-
系统修饰键(用法特殊)ctrl、alt、shift、meta
配合keyuo使用:按下修饰键的同时,再按其他键才能触发 @keyuo.ctr.y
配合keydown使用:按下触发
-
Vue.config.keyCodes.自定义键名 = 键码
8.计算属性:computed
1.差值法实现
<body>
<div id="root">
姓:<input type="text" v-model="firstName" ></br>
名:<input type="TEXT" v-model="lastName" ></br>
全名:<span>{{firstName()}}{{lasttName()}}</span>
</div>
<script type="text/javascript">
new Vue({
el:'#root',
data:{
firstName:'张三',
lastName:'李四'
}
})
</script>
2.methods实现
<body>
<div id="root">
姓:<input type="text" v-model="firstName" ></br>
名:<input type="TEXT" v-model="lastName" ></br>
全名:<span>{{fullName()}}</span>
</div>
<script type="text/javascript">
new Vue({
el:'#root',
data:{
firstName:'张三',
lastName:'李四'
},
methods:{
fullName(){
return this.firstName+"-"+this.lastName;
}
}
})
</script>
3.computed:计算属性
- 要用的属性不存在,需要通过已有属性计算得来
- 原理是借助了Object。defineproperty方法中的set、get方法实现
- 优势是与methods相比,内部有缓存机制,可以复用,效率更高
<body>
<!-- 已有的属性通过计算得来 -->
<div id="root">
姓:<input type="text" v-model="firstName" ></br>
名:<input type="TEXT" v-model="lastName" ></br>
全名:<span>{{fullName}}</span>
</div>
<script type="text/javascript">
const vm = new Vue({
el:'#root',
data:{
firstName:'张三',
lastName:'李四'
},
computed:{
fullName:{
//当有人读取fallName时,get就会被调用,且返回值为fullName的值
get(){
//此处的get调用只会在初调用时才会调用,或者讲所依赖的数据变化时,才会调用,其他时候会调用缓存
return this.firstName+"-"+this.lastName;
},
set(value){
const arr=value.split("-");
this.firstName=arr[0];
this.lastName=arr[1]
}
}
//简写-此处等价于上方,不为函数,为名称,且只能用于只考虑读取,不考虑写入时才能使用
/*
fullName(){//此处不为函数
return this.firstName+"-"+this.lastName;
}
*/
}
})
</script>
9.侦听属性:watch
侦察某一地方的属性或者方法被修改或者执行了
1.基本用法
-
当被监听的属性发生变化时,回调函数自动调用,进行相关操作
-
监视的属性必须存在,才可以使用,也可以监听计算属性
-
配置项属性immedtate:false修改为true则初始化调用一次handler(newvalue,oldvalue)
-
监视有两种写法
1.创建vue时传入watch:{}配置
2.通过vm.$watch()实现
<title>天气案例_监视属性</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2>今天天气很{{info}}</h2>
<button @click="changeWeather">切换天气</button>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el: '#root',
data: {
isHot: true,
},
computed: {
info() {
return this.isHot ? '炎热' : '凉爽'
}
},
methods: {
changeWeather() {
this.isHot = !this.isHot
}
},
// 方式一
/* watch:{
isHot:{
immediate:true,
handler(newValue,oldValue){
console.log('isHot被修改了',newValue,oldValue)
}
}
} */
})
// 方式二
vm.$watch('isHot', {
immediate: true, // 初始化时让handler调用一下
//handler什么时候调用?当isHot发生改变时
handler(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue)
}
})
</script>
2.深度监听
1.watch默认不检测对象内部值的改变(只监听一层)
2.watch中配置deep:true可以监测内部值(多层)
<title>天气案例_深度监视</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h3>a的值是:{{ numbers.a }}</h3>
<button @click="numbers.a++">点我让a+1</button>
<h3>b的值是:{{ numbers.b }}</h3>
<button @click="numbers.b++">点我让b+1</button>
<button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
{{numbers.c.d.e}}
</div>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el: '#root',
data: {
isHot: true,
numbers: {
a: 1,
b: 1,
c: {
d: {
e: 100
}
}
}
},
watch: {
// 监视多级结构中某个属性的变化
/* 'numbers.a':{
handler(){
console.log('a被改变了')
}
} */
// 监视多级结构中所有属性的变化
numbers: {
deep: true,
handler() {
console.log('numbers改变了')
}
}
}
})
</script>
3.侦听属性的简写
如果侦听属性只有handler没有其他配置项的话可以简写为
watch: {
//正常写法
isHot: {
immediate:true, //初始化时让handler调用一下
deep:true, //深度监视
handler(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue)
}
},
//简写
isHot(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue, this)
}
}
})
//正常写法
vm.$watch('isHot', {
immediate: true, //初始化时让handler调用一下
deep: true,//深度监视
handler(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue)
}
})l
//简写
vm.$watch('isHot', (newValue, oldValue) => {
console.log('isHot被修改了', newValue, oldValue, this)
})
</script>
10计算属性与侦听属性的区别
- computed能完成的功能,watch都可以完成,反之不一定
- 所有被Vue管理的函数必须写城普通函数,这样this的指向才是vm或组件实例对象
- 不被管理的函数(如定时器的回调、ajax的回调、promis的回调等)最好写成箭头函数,这样this的指向才是vm或组件实例对象
11绑定样式(class、style)
class样式
- :class=“xxx”,xxx可以是字符串、数组、对象
- :style=“[a,b]”,a、b是样式对象
- :style="{fontSize:xxx}"其中xxx是动态值
-
字符串的写法适用于:类名不确定要动态获取
-
数组写法适用于:要绑定多个样式,个数不确定
-
对象写法适用于:要绑定多个样式,个数确定,名字也确定,但是不确定用不用
<style> .basic {width: 300px;height: 50px;border: 1px solid black;} .happy {border: 3px solid red;background-color: rgba(255, 255, 0, 0.644); background: linear-gradient(30deg, yellow, pink, orange, yellow);} .sad {border: 4px dashed rgb(2, 197, 2);background-color: skyblue;} .normal {background-color: #bfa;} .atguigu1 {background-color: yellowgreen;} .atguigu2 {font-size: 20px;text-shadow: 2px 2px 10px red;} .atguigu3 {border-radius: 20px;} </style> <div id="root"> <!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 --> <div class="basic" :class="mood" @click="changeMood">{{name}}</div><br/><br/> <!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 --> <div class="basic" :class="classArr">{{name}}</div><br/><br/> <!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 --> <div class="basic" :class="classObj">{{name}}</div><br/><br/> <!-- 绑定style样式--对象写法 --> <div class="basic" :style="styleObj">{{name}}</div><br/><br/> <!-- 绑定style样式--数组写法 --> <div class="basic" :style="styleArr">{{name}}</div> </div> <script type="text/javascript"> Vue.config.productionTip = false const vm = new Vue({ el: '#root', data: { name: '尚硅谷', mood: 'normal', classArr: ['atguigu1', 'atguigu2', 'atguigu3'], classObj: { atguigu1: false, atguigu2: false, }, styleObj: { fontSize: '40px', color: 'red', }, styleObj2: { backgroundColor: 'orange' }, styleArr: [ { fontSize: '40px', color: 'blue', }, { backgroundColor: 'gray' } ] }, methods: { changeMood() { const arr = ['happy', 'sad', 'normal'] const index = Math.floor(Math.random() * 3) this.mood = arr[index] } }, }) </script>
12.条件渲染(v-if、v-show)
v-if:写法跟if else类似,适用于切换频率较低的场景
v-show:v-show=“表达式”,适用于切换频率较高的场景
注意:template标签不影响结构,但是html中不会有此标签,但只能配合v-f,不可以配合v-show
<title>条件渲染</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2>当前的n值是:{{ n }}</h2>
<button @click="n++">点我n+1</button>
<!-- 使用v-show做条件渲染 -->
<!-- <h2 v-show="false">欢迎来到{{name}}</h2> -->
<!-- <h2 v-show="1 === 1">欢迎来到{{name}}</h2> -->
<!-- 使用v-if做条件渲染 -->
<!-- <h2 v-if="false">欢迎来到{{name}}</h2> -->
<!-- <h2 v-if="1 === 1">欢迎来到{{name}}</h2> -->
<!-- v-else和v-else-if -->
<!-- <div v-show="n === 1">Angular</div> -->
<!-- <div v-show="n === 2">React</div> -->
<!-- <div v-show="n === 3">Vue</div> -->
<!-- <div v-if="n === 1">Angular</div> -->
<!-- <div v-else-if="n === 2">React</div> -->
<!-- <div v-else-if="n === 3">Vue</div> -->
<!-- <div v-else>哈哈</div> -->
<!-- v-if与template的配合使用 -->
<template v-if="n === 1">
<h3>你好</h3>
<h3>尚硅谷</h3>
<h3>北京</h3>
</template>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
name:'尚硅谷',
n:0
}
})
</script>
13.列表渲染(v-for、、)
1.基本列表
v-for
用于展示列表数据
语法
<li v-for="(item,index) of items" :key=index>
这里的key是遍历对象的唯一标识,一般为index
可遍历数组、对象、字符串、指定次数
<title>基本列表</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<!-- 遍历数组 -->
<h3>人员列表(遍历数组)</h3>
<ul>
<li v-for="(p,index) of persons" :key="index">{{ p.name }}-{{ p.age }}</li>
</ul>
<!-- 遍历对象 -->
<h3>汽车信息(遍历对象)</h3>
<ul>
<li v-for="(value,k) of car" :key="k">{{ k }}-{{ value }}</li>
</ul>
<!-- 遍历字符串 -->
<h3>测试遍历字符串(用得少)</h3>
<ul>
<li v-for="(char,index) of str" :key="index">{{ char }}-{{ index }}</li>
</ul>
<!-- 遍历指定次数 -->
<h3>测试遍历指定次数(用得少)</h3>
<ul>
<li v-for="(number,index) of 5" :key="index">{{ index }}-{{ number }}</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el: '#root',
data: {
persons: [
{ id: '001', name: '张三', age: 18 },
{ id: '002', name: '李四', age: 19 },
{ id: '003', name: '王五', age: 20 }
],
car: {
name: '奥迪A8',
price: '70万',
color: '黑色'
},
str: 'hello'
}
})
</script>
2.key的作用及其原理
<title>key的原理</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2>人员列表(遍历数组)</h2>
<button @click.once="add">添加一个老刘</button>
<ul>
<li v-for="(p,index) of persons" :key="index">
{{p.name}}-{{p.age}}
<input type="text">
</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el: '#root',
data: {
persons: [
{ id: '001', name: '张三', age: 18 },
{ id: '002', name: '李四', age: 19 },
{ id: '003', name: '王五', age: 20 }
]
},
methods: {
add() {
const p = { id: '004', name: '老刘', age: 40 }
this.persons.unshift(p)
}
},
})
</script>
3.列表的过滤
根据一定的条件,在目标数据中找出符合条件的部分数据
<title>列表过滤</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2>人员列表</h2>
<input type="text" placeholder="请输入名字" v-model="keyWord">
<ul>
<li v-for="(p,index) of filPersons" :key="p.id">
{{ p.name }}-{{ p.age }}-{{ p.sex }}
</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
// 用 watch 实现
// #region
/* new Vue({
el: '#root',
data: {
keyWord: '',
persons: [
{ id: '001', name: '马冬梅', age: 19, sex: '女' },
{ id: '002', name: '周冬雨', age: 20, sex: '女' },
{ id: '003', name: '周杰伦', age: 21, sex: '男' },
{ id: '004', name: '温兆伦', age: 22, sex: '男' }
],
filPersons: []
},
watch: {
keyWord: {
immediate: true,
handler(val) {
this.filPersons = this.persons.filter((p) => {
return p.name.indexOf(val) !== -1
})
}
}
}
}) */
//#endregion
// 用 computed 实现
new Vue({
el: '#root',
data: {
keyWord: '',
persons: [
{ id: '001', name: '马冬梅', age: 19, sex: '女' },
{ id: '002', name: '周冬雨', age: 20, sex: '女' },
{ id: '003', name: '周杰伦', age: 21, sex: '男' },
{ id: '004', name: '温兆伦', age: 22, sex: '男' }
]
},
computed: {
filPersons() {
return this.persons.filter((p) => {
return p.name.indexOf(this.keyWord) !== -1
})
}
}
})
</script>
4.列表的排序
<title>列表排序</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2>人员列表</h2>
<input type="text" placeholder="请输入名字" v-model="keyWord">
<button @click="sortType = 2">年龄升序</button>
<button @click="sortType = 1">年龄降序</button>
<button @click="sortType = 0">原顺序</button>
<ul>
<li v-for="(p,index) of filPersons" :key="p.id">
{{p.name}}-{{p.age}}-{{p.sex}}
<input type="text">
</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el: '#root',
data: {
keyWord: '',
sortType: 0, // 0原顺序 1降序 2升序
persons: [
{ id: '001', name: '马冬梅', age: 30, sex: '女' },
{ id: '002', name: '周冬雨', age: 31, sex: '女' },
{ id: '003', name: '周杰伦', age: 18, sex: '男' },
{ id: '004', name: '温兆伦', age: 19, sex: '男' }
]
},
computed: {
filPersons() {
const arr = this.persons.filter((p) => {
return p.name.indexOf(this.keyWord) !== -1
})
//判断一下是否需要排序
if (this.sortType) {
arr.sort((p1, p2) => {
return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age
})
}
return arr
}
}
})
</script>
5.vue更新数组数据时的问题
修改数组中的的某个元素一定要用以下方法
push,pop,unshift,shift,splice,sort,reverse
<title>更新时的一个问题</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2>人员列表</h2>
<button @click="updateMei">更新马冬梅的信息</button>
<ul>
<li v-for="(p,index) of persons" :key="p.id">
{{p.name}}-{{p.age}}-{{p.sex}}
</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el: '#root',
data: {
persons: [
{ id: '001', name: '马冬梅', age: 30, sex: '女' },
{ id: '002', name: '周冬雨', age: 31, sex: '女' },
{ id: '003', name: '周杰伦', age: 18, sex: '男' },
{ id: '004', name: '温兆伦', age: 19, sex: '男' }
]
},
methods: {
updateMei() {
// this.persons[0].name = '马老师' //奏效
// this.persons[0].age = 50 //奏效
// this.persons[0].sex = '男' //奏效
// this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
this.persons.splice(0, 1, { id: '001', name: '马老师', age: 50, sex: '男' })
}
}
})
</script>
14收集表单数据v-model
-
若则vmodel获取的是value值,即为用户输入的内容
-
若则vmodel获取的是value值,即为标签的内容
-
若
- 没有配置value属性,则vmodel获取的是checked属性值
- 配置了value属性
- 若v-model初始值是非数组,那么收集的是checked,布尔值
- 是数组,那么收集的是value组成的数组
-
v-model的三个修饰符,例如 v-model.lazy=“infor”
- lazy:市区焦点后再收集数据
- number:输入字符串转为有效的数字
- trim:过滤首尾空格
<title>收集表单数据</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<form @submit.prevent="demo">
账号:<input type="text" v-model.trim="userInfo.account"> <br /><br />
密码:<input type="password" v-model="userInfo.password"> <br /><br />
年龄:<input type="number" v-model.number="userInfo.age"> <br /><br />
性别:
男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
女<input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br /><br />
爱好:
学习<input type="checkbox" v-model="userInfo.hobby" value="study">
打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
<br /><br />
所属校区
<select v-model="userInfo.city">
<option value="">请选择校区</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
<option value="wuhan">成都</option>
</select>
<br/><br/>
其他信息:
<textarea v-model.lazy="userInfo.other"></textarea> <br/><br/>
<input type="checkbox" v-model="userInfo.agree">阅读并接受
<a href="https://www.yuque.com/cessstudy">《用户协议》</a>
<button>提交</button>
</form>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el: '#root',
data: {
userInfo: {
account: '',
password: '',
age: 18,
sex: 'female',
hobby: [],
city: 'beijing',
other: '',
agree: ''
}
},
methods: {
demo() {
console.log(JSON.stringify(this.userInfo))
}
}
})
</script>
15.过滤器
定义:对要显示的数据进行特定格式化之后再显示(适用于一些简单处理)
语法:如下
备注:过滤器也可以接受额外参数,多个过滤器也可以串联
并没有改变原本的数据,是产生新的对应的数据
<div id="root">
<h2>显示格式化后的时间</h2>
<h3>现在是:{{time}}</h3>
<!-- 计算属性实现 -->
<h3>计算属性实现格式化后的时间:{{fmtTime}}</h3>
<!-- methods实现 -->
<h3>methods格式化后的时间:{{getFmtTime()}}</h3>
<!-- 过滤器实现 -->
<h3>过滤器实现格式化后的时间:{{time | timeFormater}}</h3>
<!-- 过滤器传参实现 -->
<h3>过滤器实现格式化后的时间:{{time | timeFormater('YYYY-MM-DD') |mySlice}}</h3>
</div>
<script type="text/javascript">
//全局过滤器
Vue.filter('myslice',function(value){
return value.slice(0,4)
})
new Vue({
el:'#root',
data:{
time:1621561377603
},
computed:{
fmtTime(){
return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
}
},methods:{
getFmtTime(){
return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
}
},filters:{
// timeFormater(value){无参
// return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
// }
timeFormater(value,str="YYYY-MM-DD HH:MM:ss"){//传参
return dayjs(this.time).format(str)
},
mySlice(value){
return value.slice(0,4)//取前四位
}
}
})
</script>
16.内置指令
之前学过的指令
v-bind 单向数据绑定
v-model 双向
v-for 遍历
v-on 绑定监听事件
v-show 条件渲染
v-if 条件渲染
v-else-if 条件渲染
v-else 条件渲染
新指令
v-text 想其所在节点中渲染文本内容,与插值语法的区别是会替换掉节点中的内容
//例如
<div v-text="name"></div>
v-html
作用:向指定节点总渲染包含html结构中的内容
与插值语法的区别是
- v-html会替换掉节点中所有内容,{{xxx}}不会
- v-html可以识别html结构
注意:v-html有严重的安全性问题,一定只能在可信的内容上使用
<div v-html="name"></div>
<div v-html="str"></div>
name=‘tom’
str=<a>{{name}}</> 正确用法
v-cloak
此指令没有值,本质是一个特殊属性,vue创建实例并接管容器后,会删掉此属性
使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}
<title>v-cloak指令</title>
<style>
[v-cloak] {
display:none;
}
</style>
<div id="root">
<h2 v-cloak>{{ name }}</h2>
</div>
// 够延迟5秒收到vue.js
<script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
<script type="text/javascript">
console.log(1)
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{name:'cess'}
})
</script>
v-once
所在节点再初次动态渲染后就视为静态内容了,即为动态值静态化
以后数据的改变 不会引起v-once所在结构的更新,可以优化性能
<title>v-once指令</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2 v-once>初始化的n值是: {{n}}</h2>
<h2>当前的n值是: {{n}}</h2>
<button @click="n++">点我n+1</button>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({ el: '#root', data: {n:1} })
</script>
v-pre
跳过此所在节点的编译过程
即跳过没有使用指令语法、没有使用插值语法的节点,或加快编译
<title>v-pre指令</title>
<script type="text/javascript" src="../js/vue.js"></script>
<div id="root">
<h2 v-pre>Vue其实很简单</h2>
<h2 >当前的n值是:{{n}}</h2>
<button @click="n++">点我n+1</button>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({ el:'#root', data:{n:1} })
</script>
自定义指令directives
定义语法
-
局部指令
new Vue({ directives:{ 指令名:配置对象 } }) new Vue({ directives:{ 指令名:回调函数 } })
-
全局指令
Vue.directive(指令名, 配置对象) 或 Vue.directive(指令名, 回调函数) Vue.directive('fbind', { // 指令与元素成功绑定时(一上来) bind(element, binding) { // element就是DOM元素,binding就是要绑定的 element.value = binding.value }, // 指令所在元素被插入页面时 inserted(element, binding) { element.focus() }, // 指令所在的模板被重新解析时 update(element, binding) { element.value = binding.value } }
配置对象中常用的3个回调函数
bind(element,binding)—>指令与元素成功绑定时调用
inserted(element,binding)—>指令与所在元素被插入页面时调用
update(element,binding)—>指令所在模块结构被重新解析时调用
备注
- 指令定义时不加 v- ,但是使用时要加 v-
- 指令名如果是多个单词,要使用kebab-case命名方式,不要驼峰命名
new Vue({
el: '#root',
data: {
n:1
},
directives: {
'big-number'(element,binding) {
element.innerText = binding.value * 10
}
}
})
">
Vue.config.productionTip = false
new Vue({ el:‘#root’, data:{n:1} })
**自定义指令directives**
定义语法
1. 局部指令
```js
new Vue({
directives:{
指令名:配置对象
}
})
new Vue({
directives:{
指令名:回调函数
}
})
-
全局指令
Vue.directive(指令名, 配置对象) 或 Vue.directive(指令名, 回调函数) Vue.directive('fbind', { // 指令与元素成功绑定时(一上来) bind(element, binding) { // element就是DOM元素,binding就是要绑定的 element.value = binding.value }, // 指令所在元素被插入页面时 inserted(element, binding) { element.focus() }, // 指令所在的模板被重新解析时 update(element, binding) { element.value = binding.value } }
配置对象中常用的3个回调函数
bind(element,binding)—>指令与元素成功绑定时调用
inserted(element,binding)—>指令与所在元素被插入页面时调用
update(element,binding)—>指令所在模块结构被重新解析时调用
备注
- 指令定义时不加 v- ,但是使用时要加 v-
- 指令名如果是多个单词,要使用kebab-case命名方式,不要驼峰命名
new Vue({
el: '#root',
data: {
n:1
},
directives: {
'big-number'(element,binding) {
element.innerText = binding.value * 10
}
}
})