DEV Community

Jihao Deng
Jihao Deng

Posted on

VUE002 Vue Directives

Vue的指令

指令就是html标签元素中带有v-的特殊属性。除了v-for,这些属性的值都是单个javascript表达式。当指令的值发生变化时,这些变化会响应式地作用于DOM。

常见的Vue指令

  • v-show
  • v-if
  • v-else
  • v-for
  • v-bind
  • v-model
  • v-on
  • v-cloak

v-show 与 v-if

v-show会根据表达式的真假来切换元素的CSS属性display,如果表达式为假,则会给标签加上style="display: none;"这条属性。

对于下面的代码:

<div id="app">
  <h1 v-show="12>13">{{ message }}</h1>
</div>
Enter fullscreen mode Exit fullscreen mode

在浏览器打开后,<h1>标签不会显示,按下F12后,代码如下所示:

<div id="app">
  <h1 style="display: none;">Hello, Vue World!</h1>
</div>
Enter fullscreen mode Exit fullscreen mode

v-if会根据表达式的真假来渲染元素。

如果上面的例子用v-if,则整个<h1>标签都不会出现在网页源代码里。

v-for

基于数据源来对元素进行多次渲染,数据源可以是数组或者对象,v-for后面的值依然是一个js表达式,带有这个属性的标签(加上它的子标签)会被循环创建多次。

具体的例子如下:

<body>
  <div id="app">
    <div v-for="item in dataSource">
      Name: {{item.name}}<br>
      Age: {{item.age}}
    </div>
  </div>
</body>

<script>
  var app = new Vue({
    el: '#app',
    data: function () {
      return {
        dataSource: [
          {name: 'Alice', age: 13},
          {name: 'Bob', age: 12},
          {name: 'Carol', age: 12},
          {name: 'Daniel', age: 13},
        ]
      }
    }
  })
</script>
Enter fullscreen mode Exit fullscreen mode

渲染后的结果为:

<div id="app">
    <div>
      Name: Alice<br>
      Age: 13
    </div><div>
      Name: Bob<br>
      Age: 12
    </div><div>
      Name: Carol<br>
      Age: 12
    </div><div>
      Name: Daniel<br>
      Age: 13
    </div>
</div>
Enter fullscreen mode Exit fullscreen mode

v-for进阶

除了上述的简单例子,v-for还支持一个可选的第二个参数,即当前项的索引。当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,我们需要用v-bind来为每一个元素指定一个key:

<div id="app">
  <li v-for="(item, index) in dataSource" v-bind:key="index">
    {{ index + 1 }} - {{ item.name }} - {{item.age}} 岁
  </li>
</div>
Enter fullscreen mode Exit fullscreen mode

v-for也可以用于遍历json对象。比如对于下面这个例子:

dataObj: {
  name: "Hue",
  identity: "Fairy",
  age: 3,
  hp: 10938,
  mp: 1080,
  level: 35,
  dps: 2405
}
Enter fullscreen mode Exit fullscreen mode

可以这样使用v-for

<li v-for="(val, name, index) in dataObj" v-bind:key="index">
  {{index + 1}} - {{name}} : {{val}}
</li>
Enter fullscreen mode Exit fullscreen mode

v-bind

为一个标签动态绑定一个或者多个属性,或者为一个组件的prop绑定到js表达式。

如果属性是class或style,其值支持数组或对象。其他的属性的值只能是基本数据类型。

<body>
  <div id="app">
     <input type="text" v-bind:placeholder="myPlaceHolder">
     <!-- v-bind:class="{'表达式成立时的类名', 表达式}" -->
     <!-- v-bind:class="['类名1', '类名12', '类名3']" -->
     <button v-bind:class="{'active': 12>11}">Yes</button>
     <button v-bind:class="['active', 'warning']">No</button>
  </div>
</body>

<script>
  var app = new Vue({
    el: '#app',
    data: function () {
      return {
        myPlaceHolder: "Username"
      }
    }
  })
</script>
Enter fullscreen mode Exit fullscreen mode

虽然这个例子实用性为零,但是它使得我们仅仅通过修改myPlaceHolder的值就可以更改DOM。

v-bind可以进一步简写,比如上面的例子中,v-bind:placeholder可以简写为:placeholder

v-model

对表单元素<input><textarea><select>等元素创建双向绑定,即:

  • 数据的变化会影响视图
  • 视图的变化会影响数据

具体可以参考官网 https://cn.vuejs.org/v2/guide/forms.html

<body>
  <div id="app">
    <!-- input box 输入框 -->
    <h2>{{ "Hello " + username }}</h2>
    <p>{{ message }}</p>
    <input type="text" v-model="username">
    <br>
    <textarea v-model="message"></textarea>
    <br>
    <!-- selector group 单选 -->
    <input type="radio" value="One" v-model="picked">
    <label>One</label>
    <br>
    <input type="radio" value="Two" v-model="picked">
    <label>Two</label>
    <br>
    <span>Picked: {{ picked }}</span>
    <br>
    <!-- Mutiple selector 多选 -->
    <input type="checkbox" value="Jack" v-model="checkedNames">
    <label>Jack</label>
    <input type="checkbox" value="John" v-model="checkedNames">
    <label>John</label>
    <input type="checkbox" value="Mike" v-model="checkedNames">
    <label>Mike</label>
    <br>
    <span>Checked names: {{ checkedNames }}</span>
  </div>
</body>

<script>
  var app = new Vue({
    el: '#app',
    data: function () {
      return {
        username: "John",
        message: "",
        picked: "",
        checkedNames: []
      }
    }
  })
</script>
Enter fullscreen mode Exit fullscreen mode

对于上面的例子,当表单的内容变化时,那些含有{{ }}的标签里面的内容也会同步发生变化。

对于单选radio,vue会根据v-model绑定的值来决定它们是不是一组。

v-on

v-on的作用是监听DOM事件,并在触发时运行一些JavaScript代码。

官方文档 https://cn.vuejs.org/v2/guide/events.html

比如按钮的点击事件,可以写成v-on:click

<h1>{{message}}</h1>
<button v-on:click="message = message + 's'">change text</button>
Enter fullscreen mode Exit fullscreen mode

但是在实际应用中,许多事件处理逻辑会更为复杂,所以直接把 JavaScript 代码写在v-on指令中是不可行的。因此v-on还可以接收一个需要调用的方法名称。可以在new Vue()中传入methods参数来定义方法(this对象很关键)。

<body>
  <div id="app">
     <h1>{{message}}</h1>
     <button v-on:click="changeText">change text</button>
  </div>
</body>

<script>
  var app = new Vue({
    el: '#app',
    data: function () {
      return {
        message: "sfsf"
      }
    },
    methods: {
      changeText: function (event) {
        this.message = this.message + "s";
      }
    }
  })
</script>
Enter fullscreen mode Exit fullscreen mode

类似与v-bind:可以用:替代,v-on:可以用@替代。上面的v-on:click可以简写成@click

更多复杂的使用可以参考官网。

v-cloak

这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。

换句话说,v-cloak算作一个元素的属性,在页面加载完毕后,这个属性会自动删除。

Top comments (0)