Vue-cli——key&$nextTick()&$set()&$foceUpdate()&自定义指令&自定义插件

一、key

列表渲染时,key值最好是对象的唯一属性值,比如:学号,工号,身份证号,手机号等等。
目的是:当列表更新时,提高后期的渲染性能。
因为vue在渲染数据时,先将数据生存一份虚拟DOM,再将虚拟DOM生成对应的真实DOM挂载到页面中
当vue中的数据修改后,会重新生成一份虚拟DOM,并跟之前的虚拟DOM进行匹配,
如果两份虚拟DOM中的key和key对应的值完全相同,不会重新生成对应的真实DOM
只有key和key对应的值不同的虚拟DOM,才会生成新的真实DOM并挂载的页面中。

(1)key最好是对象的唯一属性

在循环列表时,如果key为index下标,后续要修改数据时候,和该数据相关的下标都会进行重新渲染,这样很损耗性能

    <li v-for="(item) in employees" :key="index">{{item}}</li>

(2)key最好是对象的唯一属性值

    <li v-for="(item) in employees" :key="item.id">{{item}}</li>
key.png

二、$nextTick()

操作数据后,会重新渲染页面。如果此时要获取最后一次元素,直接获取可能会页面还没渲染完成。此时可以使用$nextTick()延后执行
$nextTick方法,需要传一个回调函数,
回调函数里面的代码在DOM更新完成后执行。

    addCar() {
      let car = {
        id: Date.now(),
        name: this.carName,
      };
      this.cars.push(car);
添加完后清空文本框,文本框绑定的值是carName,所以只需要设置这个值为空,文本框就为空
      this.carName = "";
      this.$nextTick(() => {
让最后一个li元素里面的input元素获取焦点
        this.$refs.list.lastChild.lastChild.focus();
      });
    },

三、$set

vue数据是响应式的,只要数据发生变化页面就会更新,重新渲染DOM,后加的数据没有响应式
Vue.$set(target,key,value):可以动态的给数组、对象添加和修改数据,并更新视图中数据的显示。
$set 这个方法只能用于data 里面的子数组对象,而不能直接用于data (这个根数据)
使用Vue.set(object, key, value)方法将响应属性添加到嵌套的对象上。Vue.set(this.form, 'showFlag', true)
还可以使用vm.$set实例方法,这也是全局Vue.set方法的别名:this.$set(this.form, 'showFlag', true)

(1)通过$set添加响应式数据

addsex(){
this.$set(this.employee,'sex','男')
}

四、$forceUpdate()

直接给对象添加属性和值,页面不会重新渲染。可以使用$forceUpdate()迫使页面更新

      addSex(){
这种方式添加不具备响应式,就不会更新页面
          this.employee.sex='男' 
          this.$forceUpdate()
      }

五、自定义指令

vue自带了很多指令如:v-for、v-if、v-show、v-bind、v-on等
我们也可以通过directives定义指令,指令就是一个方法:
方法的第一个参数传递的是指令所在的DOM元素。
第二个参数的bind是给指令绑定的值(指令也可不传值),返回是对象。这个对象的vlue属性就是当前元素的内容。expression是给指令绑定的值。name是指令的名称。rawName是指令全名。
定义局部指令,所有的指令背后都是在操作DOM,我们将这种功能称之为:造轮子。

(1)局部自定义指令&v-html实现原理

    <div v-red>好好学习</div>
    <p v-red>天天向上</p>
    <div v-html="car"></div>
    <div v-myhtml="car"></div>
 
  directives:{
      //指令就是一个方法,方法的第一个参数传递的是指令所在的DOM元素
      red:function(el){
          el.style.color="red"
      },
      //指令方法的第二个参数是给指令绑定的值
      myhtml(el,bind){
          el.innerHTML = bind.value
      }
  },

(2)创建全局自定义指令

新建文件src->directive->index.js
然后在mian.js中注册全局指令import './directive'

mian.js
import './direcktive'

directive中先引入vue
import Vue from 'vue'
Vue.directive('color',function(el,bind){
    el.style.color=bind.value
})

组件中使用
    <p v-html="car" v-color="'pink'"></p>
    <p v-myhtml="car" v-color="'green'"></p>

六、自定义插件

新建文件src->plugins->index.js,然后在main.js中导入和use使用.
vue-router是一个插件,插件必须要use后才能使用。Vue.use(VueRouter)
插件通常用来为Vue添加全局功能,插件的功能范围没有严格的限制——一般有下面几种:
1.添加全局方法或prototype。如:vue-custom-element
2.添加全局资源:指令/过滤器/过渡等。如vue-touch
3.通过全局混入来添加一些组件选项。如vue-router
4.添加vue实例方法,通过把他们添加到vue.prototype上实现。
5.一个库,提供自己的API,同时提供上面提到的一个或多个功能,如vue-router

1.main.js中导入自定义插件
// 导入自己插件
import myPlugin from './plugins'
// 注意:一定要use
Vue.use(myPlugin)
2.plugins
// 插件本质上就是一个对象
export default {
    // 该对象中必须包含一个install()方法
    // install()方法的第一个参数是Vue,第二个参数是配置对象
    // install()方式,会在use的时时候执行,
    // Vue.use(插件),这里的Vue会作为install方法的第一个参数
    install:function(Vue,options){
    // 可以直接给Vue添加成员,这种方法添加实例获取不了
        Vue.sayHi = function(){
            console.log('大家好!我是Vue');
        },
        Vue.msg = "欢迎是插件",
        // 可以在Vue的原型上扩展成员
        Vue.prototype.sayHello = function(){
            console.log('哈哈!我是Vue原型上的方法');
        },
        // 给Vue混入成员
        Vue.mixin({
            data() {
                return {
                    plane:{
                        name:'奔驰',
                        price:'100W'
                    }
                }
            },
            methods: {
                showPlane(){
                    console.log(this.plane.name,this.plane.price);
                }
            },
        }),
        // 注册全局组件
        Vue.component('b-box', {
            // 在脚手架环境中,只能通过渲染函数定义全局组件,不能使用模板
            render(h) {
                return h('div',this.$slots.default)

           渲染指定h函数,返回 h函数,实参是(‘div’,这个插槽预留位置除了具名插槽)
           $slots是一个插槽用来预留位置,default则是指除了具名插槽以外的所有内容。
为了便于理解,可以将this.$slots.default理解成<slot></slot>,将this.$slots.footer理解成<slot name="footer"></slot>,
然后放置插槽的位置就和template一样的思路即可。
例如想要在p标签放置默认插槽,则将this.$slots.default当做p标签的子元素即可。具名插槽和作用域插槽类似。
            },
        }),
        // 注册全局指令
        Vue.directive('bgcolor', function(el,bind){
            el.style.backgroundColor = bind.value
        })
    }
}

3.组件
vue原型上的方法可以直接调
    <button @click="sayHello">sayHello</button> 

    <button  @click="showPlane">showPlane</button>
    <div v-bgcolor="'lightblue'">我是淡蓝色</div>
    <b-box>
      哈哈
    </b-box>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容