<div id="app">
    <span v-if="isShow">
      <label for="useremail">邮箱登陆</label>
      <input type="text" id="useremail" placeholder="邮箱登陆">
    </span>
    
    <span v-else>
      <label for="username">账号登陆</label>
      <input type="text" id="username" placeholder="账号登陆">
    </span>
    <button @click="change">切换登陆方式</button>
  </div>
    const app = new Vue({
   
      el: '#app',
      data: {
   
        isShow: true
      },
      methods: {
   
        change() {
   
          this.isShow = !this.isShow
        }
      }
    })


从上面可以看出在切换后input中的内容还继续保留了下来
原因:vue会先生成一个虚拟dom树,虚拟dom树中只有以下

    <span v-if="isShow">
      <label for="useremail">邮箱登陆</label>
      <input type="text" id="useremail" placeholder="邮箱登陆">
    </span>

当isShow为false时虚拟dom树中并不是全部替换,只是将标签的属性更改,因此文本内容仍然存在
解决办法:
在input标签上加上key属性,而且值不同。则vue中会认为这是两个完完全全不同的input标签

  <div id="app">
    <span v-if="isShow">
      <label for="useremail">邮箱登陆</label>
      <input type="text" id="useremail" placeholder="邮箱登陆" key="1">
    </span>
    
    <span v-else>
      <label for="username">账号登陆</label>
      <input type="text" id="username" placeholder="账号登陆" key="2">
    </span>
    <button @click="change">切换登陆方式</button>
  </div>