Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

    • JS

    • NodeJS

    • Vue

      • 个人理解Vue和React区别
      • Vue高级用法
        • [#](#v-model) v-model \(opens new window\)
        • [#](#vue-extend) Vue.extend \(opens new window\)
        • [#](#provide-inject) provide/inject \(opens new window\)
        • [#](#vm-nexttick) vm.\$nextTick\(\) \(opens new window\)
        • [#](#this-once-hook-beforedestroy-callback) this.\$once\('hook:beforeDestroy',callback\) \(opens new window\)
        • [#](#其他) 其他
          • [#](#组件prop为boolean) 组件prop为boolean
          • [#](#vm-attrs-vm-listeners) vm.\$attrs/vm.\$listeners
        • [#](#待更) 待更
          • [#](#watch-deep-immediate) watch deep/immediate
          • [#](#scss-deep) scss /deep/
      • Vue2.x源码分析 - 框架结构
      • Vue2.x源码分析 - 模版编译以及挂载
      • 虚拟dom算法库 - snabbdom
      • Vue2.x源码分析 - Virtual DOM实现
      • Vue2.x源码分析 - 事件系统
      • Vue2.x源码分析 - 组件系统
      • Vue2.x源码分析 - Vue.nextTick
      • Vue2.x源码分析 - inject provide
      • Vue2.x源码分析 - 解析Template模板
      • Vue2.x源码分析 - 响应式原理
      • Vue2.x源码分析 - v-model
      • Vue CLI3 插件系统原理
      • Vue Loader v15 源码解析
      • Vue3 设计思想
      • Vue3 RFCS导读
      • Vue3 响应式原理 - Ref Reactive Effect源码分析
      • Vue3 API 源码解析
      • 为何Vue3 Proxy 更快
      • Vue核心原理 - 笔记
    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • Vue
wangmings
2022-07-19
目录

Vue高级用法

# # Vue高级用法

总结Vue的高级用法,其中绝大部分也应用在yi-ui (opens new window) (opens new window)组件库中。

# # v-model (opens new window) (opens new window)

    <input v-model="searchText">
    
    <!-- 等价于:-->
    <input
      v-bind:value="searchText"
      v-on:input="searchText = $event.target.value"
    >
    
1
2
3
4
5
6
7
8

# # Vue.extend (opens new window) (opens new window)

使用基础 Vue 构造器,创建一个“子类”。简单说,就是基于一个Object可返回Vue的子类,可实例化后进行挂载。

    Modal.alert = content =>
        new Promise(resolve => {
            const Ctor = Vue.component('UModal')
            if (!Ctor) return
    
            let instance = new Ctor({
                propsData: { content, type: ModalType.ALERT, showClose: false, cancelButton: '' }
            })
            instance.$on('ok', () => resolve())
            instance.open()
        })
    
    // 实例open
    open() {
        if (!this.$el) this.$mount(document.createElement('div'))
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# # provide/inject (opens new window) (opens new window)

provide 和 inject 主要为高阶插件/组件库提供用例。与 React 的上下文特性很相似。实现原理:Vue2.x源码分析 - inject/provide

    export default {
        name: 'u-form',
        props: {
            title: String,
            labelWidth: String,
            contentWidth: String,
            okButton: { type: String, default: '确定' },
            cancelButton: { type: String, default: '取消' }
        },
        provide() {
            return {
                uForm: this
            }
        }
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    export default {
        name: 'u-form-item',
        props: {
            label: String,
            error: String,
            required: Boolean,
            tip: String
        },
        data() {
            return {
                leftSty: {},
                rightSty: {}
            }
        },
        inject: ['uForm'],
        created() {
            this.uForm.labelWidth && (this.leftSty.width = this.uForm.labelWidth)
            this.uForm.contentWidth && (this.rightSty.width = this.uForm.contentWidth)
        }
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# # vm.$nextTick() (opens new window) (opens new window)

将回调延迟到下次 DOM 更新循环之后执行。实现原理:Vue2.x源码分析 - Vue.nextTick

尽管MVVM框架并不推荐访问DOM,但有时候确实会有这样的需求,尤其是和第三方插件进行配合的时候,免不了要进行DOM操作。而nextTick就提供了一个桥梁,确保我们操作的是更新后的DOM。

    // template
    <template>
        <h ref="someElement">{{message}}</h>
    </template>
    
    <script>
    export default {
        data: () => { message: 'oldValue'}
        methods: {
            example: function () {
            // 修改数据
            this.message = 'changed'
            // DOM 还没有更新。此时如果拿DOM元素的innerHTML,依然会是'oldValue'
            this.$nextTick(function () {
                // DOM 现在更新了,可以拿到最新的DOM元素了
                this.$refs['someElement'].innerHTML // 此时可以拿到最新的innerHTML值:'changed'
            })
            }
        }
    }
    </script>
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# # this.$once('hook:beforeDestroy',callback) (opens new window) (opens new window)

程序化的事件侦听器。实现原理:Vue2.x源码分析 - 组件系统 (opens new window) (opens new window)

    mounted: function () {
      var picker = new Pikaday({
        field: this.$refs.input,
        format: 'YYYY-MM-DD'
      })
    
      this.$once('hook:beforeDestroy', function () {
        picker.destroy()
      })
    }
    
1
2
3
4
5
6
7
8
9
10
11

# # 其他

# # 组件prop为boolean

如果prop是Boolean值,如果prop有展示但未赋值意味着 true。

    <blog-post is-published></blog-post>
    
    <!-- 等价于 -->
    <blog-post :is-published="true"></blog-post>
    
1
2
3
4
5

# # vm.$attrs/vm.$listeners

这两个变量挂载到组件实例this上,避免组件属性逐层透传。

    // base component: u-link.vue
    <a v-bind="$attrs"
       v-on="$listeners">
       <slot></slot>
    </h>
    
    // high component
    <u-link name="123" attr1="123">test</u-link>
    
    // 等价于
    <a name="123" attr1="123">
       <slot></slot>
    </a>
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# # 待更

# # watch deep/immediate

# # scss /deep/

编辑 (opens new window)
个人理解Vue和React区别
Vue2.x源码分析 - 框架结构

← 个人理解Vue和React区别 Vue2.x源码分析 - 框架结构→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式