vue高级特性

Vue高级特性

未经同意 禁止转载

自定义v-model

//父组件
<p>{{val}}</p>
<component v-model='val' />

//子组件
//
    1.input使用:value而不是v-model;
    2.$emit里的change1要和model的event名对应起来;
    3.:value的变量要和props、model的prop对应起来;
//    
<input type='text' :value='text1' @input="$emit('change',$e.target.value)" />

export default{
    model:{
        prop: 'text1',
        event: 'change'
    },
    props:{
        text1:{
            type: String,
            default: ''
        }
    }
}

$nextTick

1. vue是异步渲染

2. data改变后,DOM不会立刻渲染

3. $nextTick会在DOM被渲染后触发,以获取最新DOM节点

在vue中常用获取DOM节点的方法是在标签中ref='xx',js中通过this.$refs.xx即可获取到该DOM

<!-- html -->
<div ref = 'con'>
    <p v-for="(item,index) in list" :key='index'>{{item}}</p>
</div>
<button @click='add'></button>

//js
export default{
    data(){
        return {
            list:['a','b','c']
        }
    },
    methods:{
        add(){
            //点击按钮,添加3个当前时间戳
            this.list.push(new Date().getTime())
            this.list.push(new Date().getTime())
            this.list.push(new Date().getTime())

            //下面按$nextTick使用与否分2种情况
            //1. 不使用$nextTick
            let a = this.$refs.con
            console.log(a.childNodes.length)
            
            //2.使用$nextTick
            this.$nextTick(()=>{
                let a = this.$refs.con
                console.log(a.childNodes.length)
            })

        }
    }
}

以上代码片段中不使用$nextTick时,由于list本身长度为3,期望结果是点击按钮添加3个数组长度,打印a的总长度为6,但由于vue是异步渲染,data改变后DOM不会立刻渲染,打印的结果为点击之前的实际长度3

而使用this.$nextTick(()=>{})后会再DOM被渲染后回调,获取到最新的DOM节点,点击按钮打印6,符合预期

使用$nextTick,页面渲染时会将data的修改做整合,多次data修改只会渲染一次


slot插槽

slot基本用法

//父组件
<component :src=info.src>{{info.desc}}</component>

export default{
    data(){
        return {
            info:{
                src: 'xxxxx',
                desc: '123'
            }
        }
    }
}

//子组件
<a :href='src'>
    <slot>如果父组件中info.desc为空,此处文字显示</slot>
</a>

export default{
    props:{
        src:{
            type: String,
            default: ''
        }
    }
}

slot基本用法就是在父组件中放子组件的标签内插入字内容,子组件用slot标签接收子内容,如果父组件传的字内容为空,则显示子组件slot标签内的默认内容

scopedSlot 作用域插槽

//父组件
<component :src>
    <template v-slot='slotProps'>
        {{slotProps.slotData.a}}
    </template>
</component>


//子组件
<a :href='src'>
    <slot :slotData='info'></slot>
</a>

export default{
    props:{
        src:{
            type: String,
            default: ''
        }
    },
    data(){
        return{
            info:{
                a: 1
            }
        }
    }
}

作用域插槽是把子组件内data内容通过slot传递给父组件,父组件在子组件的标签内添加template标签,并给template添加v-slot属性,通过${v-slot属性名.自杜建slot标签动态属性key值}获取到子组件内data内容

具名插槽

当子组件有多个slot,通过给slot添加name属性,父组件给子组件内容template标签添加v-slot:${子组件slot的name}来命名,也可以通过给template添加#子组件slot的name来简写


动态组件

当不确定组件类型时使用动态组件

<component :is='dynamicCom' />


import xxx from './xx'
export default{
    components:{
        dynamicCon
    },
    data(){
        return{
            dynamicCon: 'xxx'
        }
    }
}

照常引用、注册组件,使用component标签并添加:is属性,属性值为组件名


组件动态加载

普通组件采用import xx from xx的方式加载,为同步加载,当项目需要引入很大的组件时,同步加载性能会十分差,体验也很不理想,所以此时需要采用异步加载组件的方法。

该知识点会出现在vue性能优化面试题中

方法:直接在components里定义组件名,使用import()方法

export default{
    components:{
        ${组件名}:()=>import(${组件路径})
    }
}

keep-alive 组件缓存

使用场景:频繁切换,不需要重复渲染的组件

该知识点会出现在vue性能优化面试题中

用法:需要频繁切换的组件外层添加keep-alive标签,添加后组件切换时不会被销毁,会缓存起来,大幅提高渲染性能。

keep-alive控制js对象,v-show控制css的display样式属性


minxin

组件抽离公共逻辑

import 'myMixin' from './myMixin.js'
export default{
    mixins: [myMixin],
}

在myMixin.js里抽离公共逻辑,在需要使用的组件里引用该mixin

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

推荐阅读更多精彩内容

  • 以下内容是我在学习和研究Vue时,对Vue的特性、重点和注意事项的提取、精练和总结,可以做为Vue特性的字典; 1...
    科研者阅读 14,042评论 3 24
  • Vue笔记系列1、Vue.js入门3、Vue.js进阶 API 以下会随用随记一些API,可能会不定期更新。 Vu...
    其心阅读 2,053评论 0 10
  • 本章内容:表单 与 v-model、组件、自定义指令 六、表单 与 v-model 6.1、基本用法 Vue.js...
    了凡和纤风阅读 876评论 1 2
  • [TOC] Vue 学习笔记 Vue 源码解析 - 主线流程 Vue 源码解析 - 模板编译 Vue 源码解析 -...
    Whyn阅读 614评论 0 1
  • 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: 实例生命周期钩子 每个 Vue 实例...
    Timmy小石匠阅读 1,371评论 0 11