vue框架心得-yi

之前对VUE框架知道辣么一点点,在此记载自己容易忘得和不知道的一些知识

1.vue是一个渐进式的js框架

2.除了显示声明数据外,也可以指向一个已有变量,并且他们默认建立了双向绑定,当修改其中任一个,另一个也会改变。

  var myData = { a:1 };

  var app = new Vue({

    el:'#app',

    data:myData 

  });

  console.log(app .a)       // 1

  // 修改属性,原数据也会发生改变

  app .a = 2 ;

  console.log(myData .a)       // 2

  // 原数据发生改变,属性值也会发生改变 

    myData .a = 3 ;

  console.log(app .a)       // 3

3.生命周期

  大体分为三大类(可能会和官网略有差别,以官网为主):

    create:实例创建完后调用,此阶段完成了数据的检测等,但尚未挂载,$el还不可用,需要初始化一些数据时比较有用;

    mounted:挂载到实例上之后调用,一般我们的第一个业务逻辑会在这里开始;

    beforeDestory:实例销毁之前使用,主要解绑一些使用addListener监听事件等

4.v-pre    想要显示{{}}标签时使用

5.过滤器---filters

  可以串联,还可以接受参数

    // 串联

      {{ message | fiter1 | filter2 }}

    // 接受参数

      {{ message | fiterA(a ,b) }}

6.计算属性---computed

  6.1 每一个计算属性都包括一个getter(读取属性)和一个setter(设置属性)属性

    computed:{

      fullName:{

        get:function(){}

        set:function(newValue){}

      }

    }

  6.2 计算属性的依赖缓存(和method的房方法的一个不同点):一个计算属性所依赖的数据发生变化时,他才会重新取值,所以只要text不改变,计算属性就不会更新;

7.method和computed区别

  除了依赖缓存外,调用时method方法需要加()而computed则不需要

8.对象语法或数组语法给组件绑定class

  <component :class = '{ active : isActive }' ></component >

  <component :class = '[{ active : isActive },errorclass]' ></component >

9.基本指令(其他不做记录,只记录自己盲区)

  v-clock:不需要表达式;和display:none配合使用;只加一句:[v-clock]{ display:none }

      是一个解决初始化慢而导致页面闪动的最佳实践,对于简单的项目很实用,但是具有工程化的项目,比如webpack,vue-router,项目中的HTML结构只有一个空的div元素,剩余的内容都是由路由去挂载不同的组件完成的,所以不需要  v-clock;

10.可以再html中使用template:v-if,v-for,v-show(不能使用)

  <div id="app>

    <template v-if="index == 1">

      <p></p>

    </template >

  </div>

11.过滤与排序

  当你不想改变原数组时,想通过一个数组的副本来做过滤与排序的显示时,可以使用计算属性来返回过滤和排序后的数组  

   <div id="app>

     <ul>

        <template v-for='book in fiterbook'>

        <li>书名:{{book.name}}</li>

      </template >

    </ul>

  </div>

  <script>

    var app = new Vue({

      el:"#app",

      data:{

        books:[{name:'《vue.js 实战》'}]

      },

      computed:{

        fitersbook:function(){

          return this.books.fiter(function(books){

            return books.name.match(/javascript/)

          )}

        }

      }

    })

  </script>

12.v-for渲染时,vue只会更新需要更新的,不会全部更新--提高性能

  但是有例外,以下变动的数组中,vue是不能检测到的,也不会触发视图更新:

         通过索引直接设置项,比如app.books[3] = {}

      修改数组长度,比如app.books.length = 0

  SOLVE:

          第一个问题(两种方法):

        (1)使用内置的set方法

          a:Vue.set(app.books.3,{

              name:'《css 揭秘》',

              author:‘[希]  Lea Verou’

            })

           b.如果在webpack中使用组件化的方式,默认没有导入vue的,这时可以使用$set

              this.$set(app.books,3,{}) (this指的是当前的vue实例)   

          c.在非webpack模式下也可以使用 $set  ,即  app.$set           

          d.splice进行解决

            app.books.splice(3,1,{})

     第二个问题:app.books.splice(1)     

13. v-model修饰符

  (1).lazy 会转变在change事件中同步,数据并不是实时改变的,而是在失焦或按回车时才更新

  (2).trim 修饰符,可以自动过滤输入的首位空格

14.组件注册

  全局组件:要在父实例中使用这个组件,必须要在实例创建前注册

    <div id="app">

      <my-component></my-component>

    </div>

    <script>

      Vue.component({

        template:'<div>hahahhahha</div>'

      )}

      var app = new Vue({

        el:'#app'

      })

    </script>

15.vue组件模板在某些情况下会受到HTML的限制,比如<table>内规定只允许使用<tr>,<td>,<th>等这些表格元素,所以在<table>直接使用组件是无效的。解决方案:使用特殊is属性来挂载组件

  <div id="app">

    <table>

      <tbody is='my-component></tbody>

    </table>

  </div>

        <script>

    Vue.component{'my-component',{

      template:'<div>sffsfsgg</div>'

    }

    var app =  new Vue({

      el:'#app‘’

    })

  </script>                                                                                                                                                                                                                                                                                                                                                                                                                                                  注:tbody在渲染时,会被替换为组件的内容。常见的限制元素还有<ul>,<ol>,<select>

16.作用域插槽

  插槽分为:单个slot,具名 slot,作用域插槽

    <div id='app'>

      <children-component>

        <template scope='props>

          <p>来自父组件的内容</p>

          <p>{{props.msg}}</p>

        <template>

      </children-component>

    </div>                                                                                                                                                                                                                                                                                                                                                                                                                                                       <script>

        Vue.component{'children-componenet,{

          template:`<div class='container'>

            <slot msg="来自子组件的内容‘’></slot>

          </div>`

        }

        var app = new Vue({

            el:'#app'

        )}

    </script>     

  在slot元素上有一个类似props传递数据给组件的写法 msg="来自子组件的内容‘’,将数据传给了插槽。父组件使用了template元素,而且拥有一个scop='props'的特性,这里的props只是一个临时变量,就想-for='item in items',里面的item一样template内可以通过临时变量props访问来自子组件插槽的数据msg.

17.通过$slot可以访问具名slot.this.$slot.default包括了所有没有被包含在具名slot中的节点

18.组件高级用法

  (1).递归组件

      组件在他的模板内可以递归的调用自己,只要给组件设置name的选项即可

        Vue.component({

          name:'child-compnent'

          template:`<div class='child'>

                <child-component

                  :count = 'count + 1'

                  v-if='count<3'></child-component>

          </div>`

        })

    (2).内联模板

       在使用组件时,给组件标签使用'inline-template'特性,组件就会把它的内容当做模板,而不是他的内容分发,这让模板更灵活

        <div id='app'>

          <child-component inline-template>

            <div>

              <h2>在父组件中定义子组件的模板</h2>

              <p>{{msg}}</p>              //父组件的变量

                 <p>{{message}}</p>     //来自子组件的变量

            </div>

          </child-template>

        </div>

        <script>

          Vue.component('child-component',{

            data:function(){

              return(

                 msg:'在子组件声明的数据‘

              )

            }

          })

          var app = new Vue({

              el:'#app',

              data:{

                message:'在父组件声明的数据‘

              }

          })

        </script>

      在父组件中声明的数据message和子组件声明的数据msg,两个都可以渲染(如果同名,优先使用子组件的数据),这反而是内联模板的缺点--作用域比较难理解,如果不是非常特殊的使用场景,建议不要轻易使用内联模板。

  (3)动态组件

      vue.js提供了一个特殊元素<component>用来动态挂载不同的组件,使用Is特性来选择要挂载的组件

        <component is='template-one'></component>

  (4).异步组件

      性能问题,一开始把所有的组件都加载是没必要的一笔开销。好在vue.js允许将组件定义为一个工厂函数,动态的解析组件。vue.js只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。

        Vue.component({

          window.setTimeout(funtion(){

            resolve({

              template:'<div>我是异步渲染的</div>'

            )}

          },2000)

        })

        var app = new Vue({el:'#app'})

19.$nextTick

    异步更新列表

    问题:vue更新DOM,DOM仍然米有被创建出来,$nextTick就是用来指导什么时候DOM更新完成的

    vue在观察到数据变化时并不是直接更新DOM,而是开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。在缓冲时会去除重复数据,从而避免不必要的计算和DOM操作。然后在下一个事件循环tick中,vue刷新队列并执行实际(已去重)工作。所以你用一个for循环来动态改变数据100次,其实他只会应用最后一次改变,如果没有这种机制,DOM就会重绘100次,是个很大的开销。

      method:{

        getText:function(){

          this.showDay = true;

          var text = document.getElementById('div').innerHTML

        }

      }

     改为:  

     method:{

        getText:function(){

          this.$nextTick(function(){

            this.showDay = true;

            var text = document.getElementById('div').innerHTML

          }

        }

      }

20.X-Template

  <div id='app'>

    <my-component></my-component>

    <script type='text X-Template' id='my-component'>

      <p>这是组件的内容</p>

    </script>

  </div>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

           

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                                                                                             

posted @ 2020-04-13 16:02  我想出去玩~  阅读(252)  评论(0编辑  收藏  举报