vue学习笔记


cdn: <script src="https://cdn.jsdelivr.net/npm/vue"></script>

创建一个vue示例

var vm = new Vue({
  el: '#example-2',
  data: {
    name: 'Vue.js'
  },
  // 在 `methods` 对象中定义方法
  methods: {
    greet: function (event) {
      // `this` 在方法里指向当前 Vue 实例
      alert('Hello ' + this.name + '!')
      // `event` 是原生 DOM 事件
      if (event) {
        alert(event.target.tagName)
      }
    }
  }
})

表单绑定

<input type="checkbox" id="checkbox" v-model="checked">
  <label for="checkbox">{{ checked }}</label>
  <!-- 在“change”时而非“input”时更新 -->
  <input v-model.lazy="msg" />
  // 数值类型过滤
  <input v-model.number="age" type="number" />
  <input v-model.trim="msg" />

事件绑定:

<button v-on:click="greet">Greet</button>
  // 有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法
  <button v-on:click="warn('Form cannot be submitted yet.', $event)">
    Submit
  </button>
  <script>
  methods: {
    warn: function (message, event) {
      // 现在我们可以访问原生事件对象
      if (event) event.preventDefault()
      alert(message)
    }
  }
  </script>
  // 在触发事件的时候事件修饰符:
   <!-- 阻止单击事件继续传播 -->
   <a v-on:click.stop="doThis"></a>
   <!-- 提交事件不再重载页面 -->
   <form v-on:submit.prevent="onSubmit"></form>
   <!-- 修饰符可以串联 -->
   <a v-on:click.stop.prevent="doThat"></a>
   <!-- 只有修饰符 -->
   <form v-on:submit.prevent></form>
   <!-- 添加事件监听器时使用事件捕获模式 -->
   <!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 -->
   <div v-on:click.capture="doThis">...</div>
   <!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
   <!-- 即事件不是从内部元素触发的 -->
   <div v-on:click.self="doThat">...</div>
   <!-- 点击事件将只会触发一次 -->
   <a v-on:click.once="doThis"></a>
   !-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
   <input v-on:keyup.13="submit" />
   <!-- Alt + C -->
   <input @keyup.alt.67="clear" />

关于出现闪现的问题,花括号问题,未加载完显示错误: css中添加

[v-cloak] {
    display: none;
  }

// 标签中调用

<div v-cloak v-show='block_show_0'></div>

针对加载花括号的问题,可以使用v-text属性,这个属性只有在加载完成的时候才会显示数据,不会显示花括号。

计算属性缓存和方法

<!--属于计算属性-->
<p>Reversed message: "{{ reversedMessage }}"</p>
<!--属于方法-->
<p>Reversed message: "{{ reversedMessage() }}"</p>

reversedMessage属于mounted中的方法。他们的区别是,计算属性会有缓存,方法不会缓存。

// 检测vue中属性变动的方法:watch

var vm = new Vue({
    el: '#demo',
    data: {
      firstName: 'Foo',
      lastName: 'Bar',
      fullName: 'Foo Bar'
    },
    watch: {
      firstName: function (val) {
        this.fullName = val + ' ' + this.lastName
      },
      lastName: function (val) {
        this.fullName = this.firstName + ' ' + val
      }
    }
  })

计算属性 computed方法中的属性 绑定属性,其中,bind的值可以为计算属性,方法。可以用这种方法给节点添加各种属性:

<button v-bind:disabled="isButtonDisabled">Button</button>
    <div v-bind:class="{ active: isActive }"></div>

给div添加多个属性:

<div v-bind:class="[activeClass, errorClass]"></div>
      <div v-bind:class="[{ active: isActive }, errorClass]"></div>
      <div v-bind:style="styleObject"></div>

列表渲染 渲染单个元素:

<ul id="example-1">
      // items 可以使用过滤函数进行过滤
      <li v-for="(item, index) in items">
        {{ item.message }}
      </li>
    </ul>
    var example1 = new Vue({
      el: '#example-1',
      data: {
        items: [
          { message: 'Foo' },
          { message: 'Bar' }
        ]
      }
    })

渲染代码块:

<ul>
      <template v-for="item in items">
        <li>{{ item.msg }}</li>
        <li class="divider"></li>
      </template>
    </ul>

注意,当v-for 和 v-if同时使用的收,v-for要比v-if的优先级要高,也就是说,可以通过在v-if中针对v-for进行条件判断:

<li v-for="todo in todos" v-if="!todo.isComplete">
      {{ todo }}
    </li>

// 注意,2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。

关于数组更新检测 当使用数组渲染的话,如果数组有变化,将会触发视图更新。但是,仅限于通过相关方法触发:

push(),pop(),shift(),unshift(),splice(),sort(),reverse()

当使用索引直接修该数组属性的时候,不会触发视图更新。如果想在修改单个属性的时候同时触发更新,可以使用set方法:

Vue.set(vm.items, indexOfItem, newValue)
    vm.$set(vm.items, indexOfItem, newValue) // 这两行代码等效