zoukankan      html  css  js  c++  java
  • vue补充

    之前对vue只是有了一个大概的了解,项目中好多东西也没用上,所以,有空就对vue进行知识补充,记录一下零零碎碎

    重要的:

        在使用过程中,有的时候要动态的更改VUE中的某些数据,当这个数据为对象类型时,发现使用vm.arr[1] = '啦啦啦'更改时,数据是改变了的,但是视图却没有更新,后来搜到vue的视图层是不能检测到这种方式的数据更新的,以下方法可更改

    var vm = new Vue({
            el: "#wrap",
            data: {
                myData: ['a', 'b', 'c', 'd']
            }
    })
    mui('#wrap').on('tap', 'button', function() {
        vm.$set(vm.myData, 1, '啦啦');  //方法一     vm.$set(obj, index, newValue);
       Vue.set(vm.myData, 1, '啦啦'); //方法二      Vue.set(obj, index, newValue);
    })

    1:v-for

       v-for用来做循环渲染,最简单的就是

        <li v-for="site in sites"> {{ site.name }} </li> 

     但是我们有时候也要用到当前值的索引值或者键

    可以提供第二个参数为键名,如下

    <ul>
        <li v-for="(value, key) in object">  //切记,第一个参数是值,第二个参数是键名
        {{ key }} : {{ value }}
        </li>
    </ul>

     可以提供第三个参数为索引

    <ul>
        <li v-for="(value, key, index) in object">  //切记。第一个参宿是值。第二个参数是键,第三个参数是索引
         {{ index }}. {{ key }} : {{ value }}
        </li>
    </ul>

    2 计算属性

      计算属性在处理一些复杂逻辑时是很有用的。

      例如:要反转一个字符串,我们可以这么写

    <div id="app">
      {{ message.split('').reverse().join('') }}
    </div>

     虽然这样写也可以实现目的,但是这样使代码看起来让人难以理解,但是使用computed计算属性就轻松多了

     1 <div id="app">
     2   <p>原始字符串: {{ message }}</p>
     3   <p>计算后反转字符串: {{ reversedMessage }}</p>
     4 </div>
     6 <script>
     7 var vm = new Vue({
     8   el: '#app',
     9   data: {
    10     message: 'Runoob!'
    11   },
    12   computed: {
    14     reversedMessage: function () {
    16       return this.message.split('').reverse().join('')
    17     }
    18   }
    19 })

    computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值

    但是!!!

    如果对计算属性进行了双向绑定的话就得注意了

    计算属性由两部分组成:get和set,分别用来获取计算属性和设置计算属性。默认只有get,如果需要set,要自己添加。另外set设置属性,并不是直接修改计算属性,而是修改它的依赖。

    所以我们平时默认只是写了个get函数,如果对计算属性进行了数据双向绑定(v-model)并且没有写set的话,是会报错的   [Vue warn]: Computed property "fullName" was assigned to but it has no setter.,加上set就好了

    html:
    <div>
          <input type="text" v-model="firstName">
          <input type="text" v-model="lastName">
     </div>
        <input type="text" v-model="fullName">
    
    js:
     data() {
          return {
            firstName: 'su',
            lastName: 'tong'
          }
        },
      computed: {
          fullName: {
         // getter get:
    function () { return this.firstName + ' ' + this.lastName; },
         //setter set:
    function (newValue) { let value = newValue.split(' ');//set 如果fullName改变的话,它的依赖也会改变;如果不想改变依赖的值,也可以写成空函数 this.firstName = value[0]; this.lastName = value[1]; } } }

    3.监听属性

     监听属性在项目中经常用到,但是用的也不全面,这里只补充自己没用到过

    //常规用法 
    watch : { count:
    function(newValue,oldValue){ //第一个参数是count的新值,第二个参数是旧值
        document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue; } }
    //
    使用 watch 的深度遍历和立即调用功能

     //使用 watch 来监听数据变化的时候除了常用到 handler 回调,其实其还有两个参数,便是:

        //1.deep 设置为 true 用于监听对象内部值的变化

        //2.immediate 设置为 true 将立即以表达式的当前值触发回调

    //使用场景,监听数据中某个对象的变化的时候,如果不加deep,就只能监听到obj的改变,obj内部的属性如果改变了的话,就监听不到了;但是加上deep就可以监听到了。同时我们也添加了 immediate: true 配置,其会立即以 obj 的当前值触发回调。
    watch: {
      obj: {
        handler: function (newVal, oldVal) {
          console.log(newVal);
        },
      deep: true,
      immediate: true
      }
    }

    4.class的绑定

       自己经常忘了动态绑定是怎么写,然后又在网上找,很麻烦,在这里一并记录下来

    1 <div id="app">
    2   <div v-bind:class="{ 'active': isActive }"></div>   //如果isActive为真,就绑定active类名。否则,就不绑定
       <div class="static" v-bind:class="{ 'active': isActive, 'text-danger': hasError }"> </div>  //多个之间用逗号隔开
    3 </div>

      最常见的就是给第一个元素添加"active"或者其他的类名,第一个的索引为0,加上!代表真,之后的元素都为假,这样就可以达到给第一个元素绑定class的目的

    1 <div class="mui-indicator" :class="{'mui-active':!index}" v-for="(item,index) in imgArr"></div>

    5  v-bind和v-model

    1:v-bind动态绑定指令,默认情况下标签自带属性的值是固定的,在为了能够动态的给这些属性添加值,可以使用v-bind:你要动态变化的值="表达式"

    2:v-bind用于绑定属性和数据 ,其缩写为“ : ” 也就是v-bind:id  === :id  

    3:v-model用在表单控件上的,用于实现双向数据绑定,所以如果你用在除了表单控件以外的标签是没有任何效果的。

    6:父子组件互相调用方法

        1:子组件调用父组件的方法:

      在子组件写   :this.$emit('触发事件名称',参数);  //eg:this.$emit('changePreFn',10);

       在父组件:    触发事件名称="父级事件"           //eg:@changePreFn="changeCount"

      

  • 相关阅读:
    设计模式 -- 中介者设计模式 (Mediator Pattern)
    java.lang.IllegalArgumentException: View not attached to window manager
    项目中处理android 6.0权限管理问题
    Python File.readlines() 方法
    notepad++快捷键
    ora-00054:resource busy and acquire with NOWAIT specified
    空格和TAB键混用错误:IndentationError: unindent does not match any outer indentation level
    Notepad++编辑Pyhton文件的自动缩进的问题(图文)
    echoawksed eecurl的使用-shell
    python正则表达式
  • 原文地址:https://www.cnblogs.com/susutong/p/10009045.html
Copyright © 2011-2022 走看看