1. 双向数据绑定
input框中的文字可以即时显示在<h1>标签中:
<div id="app">
<input type="text" :value="str" @input="change">
<h1>{{str}}</h1>
</div>
<script src="./node_modules/vue/dist/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: '我爱Vue'
},
methods: {
change: function (e) {
let event = e || event;
this.str = event.target.value
}
}
})
</script>
复制代码
v-model就类似于上面的写法,是一种语法糖,来实现双向数据绑定。\
@keyup后面可以接修饰符 .enter .keyCode值 , 当按下回车键时,alert 出 input框中的文字:
<div id="app">
<input type="text" v-model="str" @keyup.13="keyFn">
<h1>{{str}}</h1>
</div>
<script src="./node_modules/vue/dist/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: '我爱Vue'
},
methods: {
keyFn(e) {
alert(this.str)
}
}
})
</script>
复制代码
2. v-if 与 v-show 的区别
<h1 v-if="false">pineapple</h1>
v-if 的元素只会在指令的表达式返回 true 时被渲染。如返回 false ,在DOM文档中找不到对应的元素,变成了注释。
<span v-show="false">apple</span>
v-show 的元素始终会被渲染并保留在 DOM 中。 只是简单地基于 CSS display进行切换。\
v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。
因此,如果需要非常频繁地切换,则使用 v-show 较好;
如果在运行时条件很少改变(例如页面一开始加载的时候进行判断显示),则使用 v-if 较好。
在实际的开发过程中,使用v-if比较多。\
3. v-if 与 v-for 一起使用
不推荐同时使用 v-if 和 v-for。
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。
<div id="app">
<ul>
<!-- <li v-for="(item,index) in list" v-if="item>1"> -->
//不推荐上面的写法
<li v-for="(item,index) in list">
<span v-if="item>1">
{{item}}
</span>
</li>
</ul>
</div>
<script src="./node_modules/vue/dist/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
list: [1, 2, 3]
}
})
</script>
复制代码
4. 监听器 watch
监听器watch, 只要data中的值被改变了就会被触发。
基本数据类型可以使用简写的方式。
引用数据类型使用简写的方式无效,需改用对象的方式,加deep:true深度监听。
<div id="app">
<h1>¥{{price}}</h1>
<button @click="up">涨价10元</button>
<h1>¥{{car.price}}w</h1>
<button @click="carUp">涨价1w</button>
<h2>您的爱车相比原价涨了{{car.expensive}}w</h2>
</div>
<script src="./node_modules/vue/dist/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
price: 100,
car: {
price: 100,
price0: 100,
expensive: 0
}
},
watch: {
/*属性需要和data中的属性相对应 */
/* 第一个参数a表示最新的值 第二个参数b表示之前的值 */
price: function (a, b) {
console.log('相比原价贵了' + (a - 100) + '元');
},
car: {
// 进入页面会立即执行监听器里面的handler方法
immediate: true,
// 深度监听
deep: true,
//handler方法名是固定的不可以被篡改
handler: function () {
this.car.expensive = this.car.price - this.car.price0
}
}
},
methods: {
carUp: function () { this.car.price++ },
up: function () {
this.price = this.price + 10
}
}
})
</script>
复制代码
5. 周期函数/钩子函数
<div id="app">
<h1>{{msg}}</h1>
<button @click="change">改变msg</button>
<button @click="destroy">销毁Vue实例</button>
<h1>{{time}}</h1>
</div>
<script src="./node_modules/vue/dist/vue.min.js"></script>
<script>
/* Vue的八大生命周期钩子函数 */
/* 区别之一:执行顺序的问题 beforeCreate>created>beforeMount>mounted */
new Vue({
el: "#app",
data: {
msg: '我爱Vue',
time: 0,
timeId: null
},
/* Vue实例化对象创建之前 */
beforeCreate() {
/* 实例化对象创建之前是获取不到data里面的数据的 */
console.log('beforeCreate', this.msg)
},
/* Vue实例化对象创建之后 */
created() {
/* 实例化对象创建之后可以获取data里面的数据 */
/* 实例化对象创建之后不可以获取到dom包括根节点 */
console.log('created', this.msg, this.$el)
/* ★一般在created里面调用接口把接口里面的数据赋值给到Vue的data中 */
this.timeId = setInterval(() => {
this.time++;
console.log(this.time)
}, 500)
},
/* Vue的dom挂载之前 */
beforeMount() {
/* dom挂载之前可以获取到根节点 */
/* beforeMount还没有把data中的数据渲染到dom节点上 */
console.log('beforeMount', this.$el)
},
/* Vue的dom挂载之后 */
mounted() {
/* mounted已经把data中的数据渲染到了dom节点上 */
console.log('mounted', this.$el)
/* ★一般在获取dom节点操作要放在mounted中执行,例如echarts中获取根元素 */
},
/* Vue的data值更新前 */
/* 当我把Vue实例中的data中的值改变了会触发beforeUpdate和updated */
/* 顺序上 beforeUpdate执行顺序优先于updated */
beforeUpdate() {
console.log('beforeUpdate', this.msg, this.$el)
},
/* Vue的data值更新后 */
updated() {
console.log('updated', this.msg, this.$el)
},
/* Vue组件销毁前 */
/* 在调用$destroy()方法的时候 会执行下面的两个钩子函数 */
/* 执行顺序上beforeDestroy优先于destroyed执行 */
/* ★beforeDestroy和destroyed的一个使用场景是在销毁定时器节约内存的时候都可以使用 */
beforeDestroy() {
console.log('beforeDestroy', this.msg, this.$el)
},
/* Vue组件销毁后 */
destroyed() {
console.log('destroyed', this.msg, this.$el)
clearInterval(this.timeId)
},
methods: {
change() {
this.msg = '我爱React'
},
destroy() {
this.$destroy();
}
}
})
</script>