运用VUE指令实现选项卡,模拟v-model的双向绑定

168 阅读1分钟

案例:vue指令实现简易tab栏切换(选项卡)

我们的目标如图:

screenshots.gif

思路

  • 利用v-for指令可以生成多个li
  • 利用v-bind给绑定一个active类,并且可以用表达式来决定active是true/false
  • 利用v-on指令绑定点击事件,点击的同时将变量activeIndex的值修改为对应li的下标

所以每次点击li的时候,activeIndex就变成对应下标。同时每个li会检查activeIndex是否等于自己的下标,确认过了才会显示。

<body>
    <div id="app">
      <div class="tab">
        <ul class="tab-nav">
          <li
            v-for="(n,i) in 6"
            :class="{active:activeIndex==i}"
            @click="activeIndex=i"
          >
            {{n}}
          </li>
        </ul>
        <div class="tab-part">
          <div class="part" v-for="(n,i) in 6" :class="{show:activeIndex==i}">
            {{n}}
          </div>
        </div>
      </div>
    </div>
  </body>

案例——模拟v-model的双向绑定

首先,我们回忆一下v-model最简单的写法。

<h3>单个复选框 - 普通绑定</h3>
        <p>
          <label
            ><input type="checkbox" v-model="isRem" />是否记住用户名?</label
          >
        </p>
        <p>isRem:{{isRem}}</p>
 

你去修改isRem的值,页面的勾选也会相应变化。反之,你勾选页面,实例中的isRem的值也会随之变换,我们称之为双向绑定!

screenshots.gif

另外,isRem在勾选后会显示true;在未勾选会显示false。你也可以自行绑定以下内容去改变默认显示的值<label ><input type="checkbox" v-model="isAgree" :true-value="'是'" :false-value="'否'" />是否同意?</label >

如上,true-value就定义了勾选后会显示的值,而false-value则是未勾选显示的值。

回到正题,如何模拟这种双向绑定,或者说原理是啥?

  • 首先,我们将input框的value属性和变量msg绑定在一起实现单向绑定,一旦msg变化,input框的内容也会随之变化

  • 其次,给input框绑定input事件,将元素的value赋值给变量msg,所以你在框内输入的时候,也会实时改变msg的值,至此实现双向绑定。

<div id="app">
      <!-- 将变量给到value,同时利用输入事件将value给到变量 -->
      <p><input type="text" :value="msg" @input="changeHandle" /></p>
      <p>{{msg}}</p>
    </div>

v-model在各种表单元素中的用法也稍有差异,可以查文档

image.png screenshots.gif