• 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无法做到的

  • 相关阅读:
    2019牛客暑期多校训练营(第三场)B题、H题
    2019牛客暑期多校训练营(第四场)k题、j题
    Manacher算法 & Palindrome
    HDU 3336——Count the string
    判断一个点是否在三角形内
    P1052 过河
    P1353 [USACO08JAN]跑步Running
    hdu 1686 Oulipo
    Cyclic Nacklace HDU
    高精地图技术分析
  • 原文地址:https://www.cnblogs.com/hellohello/p/7774615.html
Copyright © 2020-2023  润新知