hn-failte's blog hn-failte's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hn-failte

前端cv仔
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Webpack

  • React

  • JavaScript

  • Vue

    • Vue的响应式原理
    • Vue组件化开发
      • 组件化开发:
      • Vue实例方法与属性
      • Vue.extend与Vue.Component
      • 全局指定、组件、方法
      • 实例:Popup插件的封装
    • Vue源码解读(一)
    • Vue CLi3 修改webpack配置
    • Vue中的scoped和scoped穿透
    • Vue项目使用mock数据的几种方式
  • 混合开发

  • 学习笔记

  • 微信小程序

  • 前端
  • Vue
hn-failte
2019-08-26

Vue组件化开发

# Vue组件化开发

Vue很多人都会,而组件化也是近年来比较热的一个话题,那么你对Vue中的组件化了解多少呢?

# 组件化开发:

1、组件化开发指的是将复杂的业务拆分为一个有一个的组件 2、组件化开发的组件一般来说要灵活 3、组件化开发涉及到了Vue的js组件封装,需要掌握Vue基础、Vue实例方法与属性、Vue.extend、Vue插件等知识

# Vue实例方法与属性

vm.$mount(el) 会将当前的组件挂载el元素上,该操作会替换当前的元素 若$mount中接收的el为空,则会挂载到当前的vue实例以外的地方 当vm对象中存在el时,会挂载到el上

vm.$el 返回当前挂载的元素

# Vue.extend与Vue.Component

1、Vue.Component

定义了一个在Vue的挂载点下的一个全局组件

2、Vue.extend

定义了一个未挂载的组件类

可以接收一个组件作为当前组件类的模板

使用关键字new实例组件,可以接收参数,这个组件需要手动挂载

3、插件

Vue.use(Plugin, options)

Plugin:若为对象时,会查找并执行对象下的install方法,若为函数,会直接执行

options:传递到insntall函数中的参数

install函数的第一个参数是Vue,第二个参数为options

# 全局指定、组件、方法

import MyPlugin from ""
MyPlugin.install=(Vue, options)=>{

    // 添加全局组件
    Vue.component(MyPlugin.name, MyPlugin)

    // 挂载原型方法
    var Plugin = Vue.extend(MyPlugin)
    Vue.prototype.doPlugin = function(){
        var plugin = new Plugin({})
        document.body.appendChild(plugin.$mount().$el)
    }

    // 添加全局方法或属性
    Vue.myGlobalMethod = function () {
        // code
    }

    Vue.myGlobalProperty = 'property'

    // 添加全局资源
    Vue.directive('my-directive', {
        bind (el, binding, vnode, oldVnode) {
            // code
        }
        // code
    })

    // 注入组件选项
    Vue.mixin({
        created: function () {
            // code
        } ...
    })
}
export default MyPlugin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 实例:Popup插件的封装

编写: src/components/Popup/Popup.vue

<template>
<div class='popup-container' v-if="status">
<div class="popup-content">
<div class="popup-title">{{title}}</div>
<div class="popup-msg">{{msg}}</div>
<a class="popup-btn" href="javascript: void(0)" @click="hidePopup">x</a>
</div>
</div>
</template>
<script>
export default {
    name: 'popup'
}
</script>
<style lang="scss">
    div.popup-container{
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        background: rgba(33, 33, 33, .5);
        box-sizing: content-box;
        div.popup-content{
        position: absolute;
        top: 50%;
        left: 50%;
        margin: -150px -300px;
        background: #fff;
        width: 600px;
        height: 300px;
    }
    div.popup-title{
        width: 590px;
        height: 20px;
        padding: 5px;
        line-height: 20px;
        text-align: center;
        background: #3498db;
    }
    div.popup-msg{
        width: 588px;
        height: 239px;
        text-align: center;
        border: 1px solid #999;
        border-top: none;
        padding: 15px 5px;
    }
    a.popup-btn{
        position: absolute;
        top: 5px;
        right: 5px;
        display: block;
        width: 20px;
        height: 20px;
        line-height: 20px;
        font-size: 16px;
        text-align: center;
        text-decoration: none;
        color: #666;
        background: #f00;
    }
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

src/components/Popup/index.js

import Popup from './Popup.vue'
const defaultData = {
    status: false,
    title: 'Popup',
    msg: 'Message'
}
Popup.install = (Vue) => {
    let PopupCom = Vue.extend(Popup)
    console.log('PopupCom', PopupCom)
    Vue.prototype.$popup = function(params) {
        let popup = new PopupCom({
            el: document.createElement('div'),
            data() {
                for(let item in params){
                    defaultData[item] = params[item]
                }
                return defaultData
            },
            methods: {
                hidePopup() {
                    this.status = false;
                },
            },
        })
        console.log('popup', popup);
        console.log('popup.$mount()', popup.$mount());
        document.body.appendChild(popup.$mount().$el)
    }
}
export default Popup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

使用: src/main.js

import Vue from 'vue'
import App from './App.vue'

//引用并使用插件
import Popup from './components/Popup'
Vue.use(Popup)

new Vue({
    render: h => h(App),
}).$mount('#app')
1
2
3
4
5
6
7
8
9
10

src/main.js

<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<button @click="doit">do</button>
</div>
</template>
<script>
export default {
    name: 'app',
    methods: {
        //调用方法进行弹窗
        doit() {
            this.$popup({
                status: true
            })
        }
    },
}
</script>
<style lang="scss">
#app {
    text-align: center;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
编辑 (opens new window)
#Vue
上次更新: 2021/08/05, 12:37:41
Vue的响应式原理
Vue源码解读(一)

← Vue的响应式原理 Vue源码解读(一)→

最近更新
01
基于 Taro 的微信小程序优化指南
02-16
02
搭建一个极简混合开发架构
08-03
03
使用State Hook
04-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 hn-failte | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式