我们使用v-if来完成一个切换登录方式的例子
<!DOCTYPE html><html><head><meta charset="utf-8"><title></title></head><body><script type="text/javascript" src="https://unpkg.com/vue/dist/vue.js"></script><div id="app"><template v-if="loginType === 'email' "><h3>请输入您的邮箱</h3><input type="text" /></template><template v-if="loginType === 'phone' "><h3>请输入您的手机号</h3><input type="text" /></template><br><button type="button" v-on:click="changetype()">切换登陆方式</button></div><script>var vm = new Vue ({el: "#app",data: {loginType: "email",},methods: {changetype(){if (this.loginType == "phone") {this.loginType = "email";}else {this.loginType = "phone";}}}})</script></body></html>
我们会看到一个现象
这个现象就是说我们切换登录方式之后,输入的内容还会被保留,这是什么情况呢?
主要是因为Vue的diff算法为了保证真实的Dom树最小变动,只修改了h3,而没有变动input
Vue为了保证实体Dom树的最小变动,使用了diff算法,但是diff算法其实某一些方面还是会比较弱智
所以我们可以给以上两个元素一个分别的key值,这样切换之后,我们发现之前输入的值就不会被保留了
<div id="app">
<template v-if="loginType === 'email' ">
<h3>请输入您的邮箱</h3>
<input type="text" key="1" />
</template>
<template v-if="loginType === 'phone' ">
<h3>请输入您的手机号</h3>
<input type="text" key="2"/>
</template>
<br>
<button type="button" v-on:click="changetype()">切换登陆方式</button>
</div>
在循环生成的节点中,vue强烈建议给每一个节点唯一且稳定的key值
原因如下:
例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript" src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
<ul>
<li v-bind:key="item.id" v-for="(item,index) in productions">
{{item.name}} - {{item.stock}}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
productions: [
{id:1,name:"iphone",stock:15},
{id:2,name:"huawei",stock:16},
{id:3,name:"sanxing",stock:17},
],
},
})
</script>
</body>
</html>
