只要data中的数据发生变化,vue一定会重新解析模板
只考虑读取,不考虑修改时,可以简写computed
计算属性:
原理:底层借助了Object.defineProperty方法提供的getter和setter
get函数什么时候执行:
优势: 与methods实现相比,内部有缓存机制,效率更高
备注:
<div id="root">
姓:<input type="text" value="张" v-model="fName"> <br> 名:
<input type="text" value="三" v-model="lName"><br> 姓名: <span>{{fullName}}</span><br>
<span>{{fullName}}</span><br>
<span>{{fullName}}</span><br>
<span>{{fullName}}</span><br>
<!-- 只在控制台输出get一次,计算属性发生缓存 -->
</div>
<script>
const vm = new Vue({
el: '#root',
data: {
fName: '张',
lName: '三'
},
computed: {
fullName: {
// get作用:有人读取fullName时,get就会被调用,且返回值作为fullName的值
// get什么时候调用? 1.初次读取fullName时2.所以来的数据发生变化时
get() {
console.log('get');
console.log(this); // 计算属性中的this指向vue实例对象
return this.fName + this.lName
},
// set什么时候调用?当fullName被修改时
set(value) {
console.log('set', value);
}
}
}
})
</script>
简写:
computed: {
fullName() {
}
}
vue中三个VScode的插件
监听属性watch:
<div id="root">
<h2>今天天气很{{info}}</h2>
<button @click="changeWeather">切换天气</button>
</div>
</body>
<script>
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调用一下
// handler什么时候调用?当isHot发生改变时
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>
Vue的watch默认是无法检测对象内部值的改变
区别:
原则:
所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象: aaa(){}
aaa: function(){}
所有不被Vue管理的函数(定时器的回调函数、ajax的回调函数等),最好写成箭头函数
aaa()=>{}
计算属性完全靠fullName的返回值,计算属性不能开启异步任务维护属性
绑定样式
style样式
:style="{fontSize: xxx}"其中xxx是动态值
:style="[a,b]" 其中a、b是样式对象
例子:
<body>
<div id="root">
<div class="basic" :class="mood" @click="changeMood">{{name}}div> <br/><br/>
<div class="basic" :class="classArr">{{name}}div> <br/><br/>
<div class="basic" :class="classObj">{{name}}div> <br/><br/>
<div class="basic" :class="{atguigu1,atguigu2}">{{name}}div> <br/><br/>
<div class="basic" :style="{fontSize: fsize+'px';}">{{name}}div>
<div class="basic" :style="styleObj">{{name}}div> <br/><br/>
{name}}
v-if和v-show做条件渲染 :
v-if:
v-show
<body>
<div id="root">
<h2 v-show="a">欢迎来到{{name}}h2>
<h2 v-show="1 === 2">欢迎来到{{name}}h2>
<h2 v-if="false">欢迎来到{{name}}h2>
<h2>当前的n值是: {{n}}h2>
<button @click="n++">点我n+1button>
<div v-show="n === 1">Angulardiv>
<div v-show="n === 2">Reactdiv>
<div v-show="n === 3">Vuediv>
div>
body>
<script>
const vm = new Vue({
el: '#root',
data: {
name: 'aaa',
a: false,
n: 1
}
})
console.log(vm);
script>
<div id="root">
<!-- 遍历数组 -->
<h2>人员列表</h2>
<ul>
<li v-for="person in persons" :key="person.id">{{person.id}}-{{person.name}}-{{person.age}}</li>
<li v-for="(p,index) in persons" :key="index">{{p.id}}-{{p.name}}-{{p.age}}--{{index}}</li>
</ul>
<!-- 遍历对象 -->
<h2>汽车信息</h2>
<ul>
<li v-for="(value, k) of car" :key="k">{{k}}-{{value}}</li>
</ul>
<!-- 遍历字符串 -->
<h2>遍历字符串</h2>
<ul>
<li v-for="(number,index) of str" :key="index">
{{index}}-{{number}}
</li>
</ul>
</div>
<script>
new Vue({
el: '#root',
data: {
persons: [{
id: '001',
name: '张三',
age: 18
}, {
id: '002',
name: '张四',
age: 19
}, {
id: '003',
name: '王五',
age: 20
}, ],
car: {
name: '奥迪A8'
},
str: 'hello'
}
})
</script>
- 对生成的DOM树进行破坏顺序的操作,key值对应的节点发生变化,需要重新生成虚拟DOM并渲染真实DOM
- 没有写key,就会自动将索引值作为key值;无法识别唯一值
index为key
id为key
虚拟DOM中key的作用
对比规则:
用index作为key可能会引发的问题:
开发中如何选择key:
见下节
见下节