详解vue 组件


Posted in Javascript onJune 11, 2020

Vue的两大核心

1. 数据驱动 - 数据驱动界面显示

2. 模块化 - 复用公共模块,组件实现模块化提供基础

组件基础

组件渲染过程

template ---> ast(抽象语法树) ---> render ---> VDom(虚拟DOM) ---> 真实的Dom ---> 页面

Vue组件需要编译,编译过程可能发生在

  • 打包过程 (使用vue文件编写)
  • 运行时(将字符串赋值template字段,挂载到一个元素上并以其 DOM 内部的 HTML 作为模板)

对应的两种方式 runtime-only vs runtime-compiler

runtime-only(默认)

  • 打包时只包含运行时,因此体积更少
  • 将template在打包的时候,就已经编译为render函数,因此性能更好

runtime-compiler

  • 打包时需要包含(运行时 + 编译器),因此体积更大,大概多10Kb
  • 在运行的时候才把template编译为render函数,因此性能更差

启用runtime-compiler

vue.config.js(若没有手动创建一个)

module.exports = {
 runtimeCompiler: true //默认false
}

组件定义

1. 字符串形式定义(不推荐)

例子

const CustomButton = {
 template: "<button>自定义按钮</button>"
};

这种形式在运行时才把template编译成render函数,因此需要启用运行时编译(runtime-compiler)

2. 单文件组件(推荐)

创建.vue后缀的文件,定义如下

<template>
 <div>
 <button>自定义按钮</button>
 </div>
</template>

<template> 里只能有一个根节点,即第一层只能有一个节点,不能多个节点平级

这种形式在打包的时就编译成render函数,因此跟推荐这种方式定义组件

组件注册

1. 全局注册

全局注册是通过Vue.component()注册

import CustomButton from './components/ComponentDemo.vue'
Vue.component('CustomButton', CustomButton)

优点

  • 其他地方可以直接使用
  • 不再需要components指定组件

缺点

  • 全局注册的组件会全部一起打包,增加app.js体积

适合

  • 基础组件全局注册

2. 局部注册

在需要的地方导入

<template>
 <div id="app">
 <customButton></customButton>
 </div>
</template>
<script>
import CustomButton from "./components/ComponentDemo.vue";

export default {
 name: "App",
 components: { CustomButton }
};
</script>

优点

  • 按需加载

缺点

  • 每次使用必须导入,然后components指定

适合

  • 非基础组件

组件使用

组件复用

<template>
 <div id="app">
 <img alt="Vue logo" src="./assets/logo.png" />
 <customButton></customButton>
 <customButton></customButton>
 <customButton></customButton>
 </div>
</template>

customButton 组件

<template>
 <div id="app">
 <button @click="increment">click me {{times}} times</button>
 </div>
</template>
<script>
export default {
 data() {
 return { times: 0 };
 },
 methods: {
 increment() {
 return this.times++;
 }
 }
};
</script>

每个组件都会创建一个新实例,组件的data必须是function,因为每个实例维护自己的data数据

组件传参

1. 通过props属性

定义一个button,按钮文本通过props传入

<template>
 <button> {{buttonText}} </button>
</template>
<script>
export default {
 props: {
 buttonText: String
 }
};
</script>

调用者通过attribute传入

<customButton buttonText="Button 1"></customButton>
<customButton buttonText="Button 2"></customButton>
<customButton buttonText="Button 3"></customButton>

运行效果

详解vue 组件

2. 通过插槽<slot></slot>

组件在需要替换的地方放入插槽<slot></slot>

<template>
 <button style="margin:10px"><slot>Defalt Button</slot></button>
</template>
<script>
export default {
 props: {
 buttonText: String
 }
};
</script>

调用者的innerHtml会替换插槽的值,若为空,使用默认的

运行效果

详解vue 组件

注意:看到是用自定义组件的innerHtml替换插槽,若插槽只有一个,可以不写name attribute,若多个插槽需指定插槽name attribute

自定义事件

1. 在组件内部调用this.$emit触发自定义事件

<template>
 <div style="margin:10px">
 <button @click="increment">
 <slot>Defalt Button</slot>
 </button>
 <span>Click me {{times}} times</span>
 </div>
</template>
<script>
export default {
 props: {
 buttonText: String
 },
 data() {
 return { times: 0 };
 },
 methods: {
 increment() {
 this.times++;
 ("increment");
 }
 }
};
</script>

2. 调用者监听自定义事件

<template>
 <div id="app">
 <customButton @increment="handleIncrement"></customButton>
 <customButton @increment="handleIncrement">
 <span style="color:blue">Button 2</span>
 </customButton>
 <customButton @increment="handleIncrement">Button 3</customButton>
 <p>Total click {{totalClicks}} times</p>
 </div>
</template>
<script>
import CustomButton from "./components/ComponentDemo.vue";

export default {
 name: "App",
 components: { CustomButton },
 data() {
 return { totalClicks: 0 };
 },
 methods: {
 handleIncrement() {
 this.totalClicks++;
 }
 }
};
</script>

3. 运行效果

详解vue 组件

以上就是详解vue 组件的详细内容,更多关于vue组件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
详解JavaScript函数绑定
Aug 18 Javascript
jquery获取复选框被选中的值
Apr 10 Javascript
jquery实现标签上移、下移、置顶
Apr 26 Javascript
JavaScript中的getMilliseconds()方法使用详解
Jun 10 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
Angular 2.x学习教程之结构指令详解
May 25 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
JS实现标签滚动切换效果
Dec 25 Javascript
react-native动态切换tab组件的方法
Jul 07 Javascript
vue实现员工信息录入功能
Jun 11 #Javascript
JavaScript Event Loop相关原理解析
Jun 10 #Javascript
vue Element左侧无限级菜单实现
Jun 10 #Javascript
详解用js代码触发dom事件的实现方案
Jun 10 #Javascript
Vue中key的作用示例代码详解
Jun 10 #Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 #Javascript
js 获取扫码枪输入数据的方法
Jun 10 #Javascript
You might like
十天学会php之第六天
2006/10/09 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
python 调用win32pai 操作cmd的方法
2017/05/28 Python
手把手教你python实现SVM算法
2017/12/27 Python
儿童学习python的一些小技巧
2018/05/27 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
DNA基因检测和分析:23andMe
2019/05/01 全球购物
中学生团员自我评价分享
2013/12/07 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
台风停课通知
2015/04/24 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫