vue笔记

new Vue({
        el: '#app-5',
        data: {
            message: 'Hello Vue.js!'
        },
        methods: {
            reverseMessage: function () {
                this.message = this.message.split('').reverse().join('')
            }
        }
    })

方法内的this指向vue实例。而且组件中上下文与vue实例是相互关联的,data和methods对象里的属性会被添加到vue实例上了:

常见指令

<div id="app">{{ message }}</div> :文本输出
<span v-bind:title="message">  :message单向绑定到title属性上(或其他任意名字的自定义属性)
<p v-if="seen">:移除或插入元素(和ng-if一样,不保留元素的状态)
<li v-for="todo in todos">{{ todo.text }}</li> :for循环
<button v-on:click="reverseMessage">绑定点击事件</button>
<input v-model="message">:双向绑定

其中bind和on有以下的简写形式

<a @click="doSomething"></a>
<a :href="url"></a>

一个实例对象类似ng中的scope对象,也有一样的watch方法。

vm.$watch('a', function (newValue, oldValue) {
  // 此回调函数将在 `vm.a` 改变后调用
})

但很不同的是,ng中允许动态添加属性,而往vue上动态添加属性,则没有双向绑定的性质。vue实例创建时就设置好了对应属性的动态性,后续再添加进去的没有这个性质,所以后续可能用到的属性,就先放一个空值上去占位

data: {
  newTodoText: '',
  visitCount: 0,
  hideCompletedTodos: false,
  todos: [],
  error: null
}

通过vm操作的属性,实际是操作data对象(如果字段字段匹配的话):

// data 对象
var data = { a: 1 }
// 此对象将会添加到 Vue 实例上
var vm = new Vue({
  data: data
})

vm.a = 2
data.a // => 2
// ... 反之亦然
data.a = 3
vm.a // => 3

可见,只要把data抽出来,可实现两个组件共用数据

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>123</title>
    <script src="https://unpkg.com/vue"></script>
<body>
<div id="c1">
    {{msg}} <br>
    <input type="text" v-model="msg">
</div>
<div id="c2">{{msg}}</div>

<script>
    var common = {
        msg:"",
    };
    new Vue({
        el: '#c1',
        data: common
    });
    new Vue({
        el: '#c2',
        data: common
    });
</script>
</body>
</html>

模板

<span>Message: {{ msg }}</span>
<span v-once>这里的值永远不会改变:{{ msg }}</span>

前者一直存在动态绑定的性质,而后者仅仅绑定一次,以节省消耗,这种思路对应ng中一个库bindonce,也是实现类似的功能。

和ng一样,html中的各种表达式都是可以正确执行的,都无法执行流程控制语句

{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id"></div>

computed和method

如何时刻保持两个数据的关联?

1.使用表达式 ,如{{x*2+1}}

2.使用computed,可以改善第一种方法中导致html页面逻辑混乱的问题

3.通过函数调用,将表达式作为返回值返回。

2和3的区别是:

  3始终会导致表达式执行,不管表达式的值有没有发生变化。执行的时机是重新渲染的时候

  2仅在相关联的数据被修改时发生变化时才会被调用(别人通知他,他才去执行),否则读取上次缓存的值,而不去执行表达式

4.使用watch,watch有两种写法

watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
vm.$watch('a', function (newValue, oldValue) {
  // 此回调函数将在 `vm.a` 改变后调用
})

watch和computed相比

  watch只能监视一个值的变化,而computed可以监视多个值的变化,只要其中一个发生变化(有收到通知),表达式的结果就会不同;

  watch等待某个值发生变化后,执行某些异步操作,然后再修改数据。这是computed无法做到的

原文地址:https://www.cnblogs.com/hellohello/p/7774615.html