博客
关于我
vue中的一些高级特性(含vue3新特性)
阅读量:336 次
发布时间:2019-03-04

本文共 3587 字,大约阅读时间需要 11 分钟。

文章目录

vue2.0自定义v-model组件

注意下面是vue2的自定义v-model组件使得子组件和父组件的其他dom实现双向绑定,但是vue2.0的实现方式有诸多缺点

比如:

  • 只能双向绑定一个值,不能双向绑定多个值
  • 实现方式比较繁琐,并且难以理解

子组件CustomVModel.vue

父组件index.vue

vue3.0实现自定义v-model

在这里插入图片描述

根据上图的比较,我们得知vue3.0实现自定义v-model必须具备以下条件

  • 必须具备modelValue属性
  • 需要在更新的时候必须触发一个onUpdate:modelValue的事件

必须具备modelValue属性

在子组件中ValidateInput:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
vue3.0的context 是 setup() 的第二个形参,它是一个上下文对象,可以通过 context 来访问Vue的实例 this
在这里插入图片描述
在父组件中:
在这里插入图片描述

在这里插入图片描述

$nextTick

  • Vue是异步渲染的框架
  • data改变之后,DOM不会立刻渲染
  • $nextTick会在DOM渲染之后被触发,以获取最新的DOM节点

点第一次

在这里插入图片描述

  • 异步渲染,$nextTick 待 DOM 渲染完再回调
  • 页面渲染时会将 data 的修改做整合,多次 data 修改只会渲染一次

vue的动态组件

一句话来概括就是将组件以变量的形式进行渲染

语法如下

import HelloWorld from './HelloWorld'export default { components: { HelloWorld }, data() { return { HelloWorldName: "HelloWorld", } }}

vue异步加载组件

异步加载组件的简单理解就是什么时候需要用到什么时候就加载

异步组件不需要用import引入了 在下面是这种方式: FormDemo: () => import(’…/…/BaseUse/FormDemo’) 在components里面引入的

点击这个按钮就会出现FormDemo组件(此组件就不贴代码了)

keep-alive

先从字面意思 上理解,坚持活着,这里的主语是组件,其实本质上就是缓存组件的意思,缓存频繁切换的组件,使其不重复渲染。可以优化vue项目的性能

下面的实例营造了这样一个场景:有三个按钮A,B,C,分别点击不同的按钮,下面会出现不同的 组件,其实本质上就是一个简单的tabBar

将要渲染的三个组件 KeepAliveStageA,

KeepAliveStageB, KeepAliveStageC 用 keep-alive 组件包裹,他们就不会被销毁 了,除非页面被关闭
KeepAlive.vue

KeepAliveStateA.vue

KeepAliveStageB.vue

KeepAliveStageC.vue

mixin

多个组件之间有相同的逻辑,抽离出来。

这里其实思想和react的自定义hook一模一样

vue3中也有自定义hook的功能了

mixin语法有如下缺点:

  1. 变量来源不明确,不利于阅读
  2. 多个mixin可能会造成命名冲突
  3. mixin和组件可能出现多对多的关系,复杂度较高

朋友们不需要担心,现在vue3出来了,里面也有自定义hook了,完全可以代替mixin

下面一个场景就是,如果多个组件都需要使用到showName方法,就可以showName方法写到一个单独的js文件中,但是此js文件用的是vue的script相同的模板

mixin.js

export default {       data() {           return {               city: '北京'        }    },    methods: {           showName() {               // eslint-disable-next-line            console.log(this.name)        }    },    mounted() {           // eslint-disable-next-line        console.log('mixin mounted', this.name)    }}

将mixin.js引入到要渲染的组件,这个组件用到minxin的showName方法和city属性

vue3中的自定义hook函数

下面的自定义hook函数传入参数是一个dom节点,监听document中的点击事件,看点击的区域是否在这个节点内部

import {    ref, onMounted, onUnmounted,Ref } from "vue";const useClickOutside = (elementRef: Ref
) => { const isClickOutside = ref(false) const handler = (e: MouseEvent) => { if (elementRef.value) { if (!elementRef.value.contains(e.target as HTMLElement)) { isClickOutside.value = false }else{ isClickOutside.value = true } } } onMounted(() => { // console.log(123132132); document.addEventListener('click', handler) // console.log(isClickOutside.value); }) onUnmounted(() => { document.removeEventListener('click', handler) }) return isClickOutside}export default useClickOutside
const isClickOutside = useClickOutside(dropRef);    watch(isClickOutside, () => {         // console.log(isClickOutside.value);      if (isOpen.value && !isClickOutside.value) {           console.log("watch");        isOpen.value = false;      }    });

转载地址:http://jyue.baihongyu.com/

你可能感兴趣的文章
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>
MySQL InnoDB 三大文件日志,看完秒懂
查看>>
Mysql InnoDB 数据更新导致锁表
查看>>
Mysql Innodb 锁机制
查看>>
MySQL InnoDB中意向锁的作用及原理探
查看>>
MySQL InnoDB事务隔离级别与锁机制深入解析
查看>>
Mysql InnoDB存储引擎 —— 数据页
查看>>
Mysql InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>