美文网首页
Vue 指令

Vue 指令

作者: merlinCry | 来源:发表于2021-01-05 15:31 被阅读0次

总结下vue的语法,虽然文档都能查到,但偏于教程不易查找。

1.内容绑定 {{}}

双大括号绑定内容,微信小程序也是这样。支持js表达式。
<div>{{message}}</div>

双大括号输出的仅是字符串,可以用v-html将其转化为html代码,类似危险html操作。

2.元素属性绑定 v-bind

v-bind:属性名称。可以缩写成 :属性名称
可以将元素的属性与vue实例的数据进行单向绑定,即:数据变化界面会刷新,但界面上的变化不会更新vue实例中的数据。可以用方括号实现动态绑定。

示例

<input v-bind:value="message"/>
<input :value="message"/>
// 动态绑定
<input v-bind:['value']="message"/>

2.5表单输入双向绑定 v-model

// 这样在input框输入内容时候会一起修改vue实例中的message变量
<input v-model="message" placeholder="edit me">
// 其实上面这个v-model等同于一个v-bind与v-on组合
<input
  v-bind:value="searchText"
  v-on:input="searchText = $event.target.value"
>
// 自定义组件内部需要有一个名为value的props,并且将其绑定到自己的模板中某个输入框的value属性上。
Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
  `
})
// 然后就可以使用v-model了
<custom-input  v-model="message" />
// 上面这个基于value属性和input事件的绑定是默认行为,可以通过在组件中加入model属性进行修改
Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  `
})

2.6 在自定义组件上使用v-model的问题

注意是组件上,不是组件中。类似react自定义组件中,将值通过props传入组件,在组件内部适当时候通过callback的方式通知父组件,然后父组件在setState改变这个值,然后由于setstate会刷新父组件,最后修改过的值又传回给子组件。这个过程在react中比较繁琐。Vue中可以通过v-model简单实现。但是有时候这种子组件可以改变父组件值的行为会产生一些问题,并且隐藏了改变的过程,有些时候希望在chagne的时候顺便做些其他事情,这种自动的方式就不合适了。

3.事件监听 v-on

v-on:事件名称。可以缩写成 @事件名称
将元素的事件与vue实例的方法绑定。同样支持动态。

示例1 原生html元素的事件监听

<div v-on:click="sayHello" />
<div @click="sayHello" />
// 动态
<div v-on:['click']="sayHello" />

示例2vue组件的事件监听
可以通过v-on:event-name 来监听vue组件中的事件,在被监听组件内部通过this.$emit('event-name)发送事件,注意vue中推荐使用kebab-case的形式命名事件,不使用驼峰命名法,因为都会被转为小写。

<my-component v-on:my-event="doSomething"></my-component>
// 内部emit发送事件,可携带参数
Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  `
})

但是有时候仅仅想监听一下这个组件的click事件,这时候在组件内部通过emit的方式就有点繁琐了,这时候可以使用v-on的 .native修饰符。

<my-component v-on:click.native="onClick"></my-component>

注意这里只是监听了组件内部根元素的事件,也就是说根元素必须有这个事件,如根元素是个div此时监听他的input事件是不行的。

4.条件渲染 v-if 、v-else-if、v-else与v-show

当条件为truthy的时候才渲染一个模块。v-else-if、v-else必须紧根 v-if后面,否则无效。

<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>

也可以一次性判断多个模块,外面套个template元素,这个template即看不见也不影响布局,微信小程序里面同样的元素叫做black。

<template v-if="ok">
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>

v-show与v-if差不多,区别是v-show不支持template也不支持else啥的,最重要的是v-show和css中visibility属性类似,元素即使不显示的时候也占有空间。

5.循环渲染 v-for

实现类似react中用基于某个数组使用map循环渲染一个列表的功能。

// items是vue实例中的数据源,item是别名,index是索引。和react一样这里最好给个唯一key,便于更新和重用。
<ul id="example-2">
  <li v-for="(item, index) in items"  :key="item.id">
    {{ index }} - {{ item.message }}
  </li>
</ul>

// 也可以使用template
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

在vue组件上使用v-for的时候要把item作为属性绑定到组件的prop,item不会自动传进组件。

// 组件内有item index key三个props
<my-component
  v-for="(item, index) in items"
  v-bind:item="item"
  v-bind:index="index"
  v-bind:key="item.id"
></my-component>

相关文章

网友评论

      本文标题:Vue 指令

      本文链接:https://www.haomeiwen.com/subject/bdpioktx.html