详解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 相关文章推荐
学习ExtJS Panel常用方法
Oct 07 Javascript
JQuery从头学起第三讲
Jul 06 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
js实时监听文本框状态的方法
Apr 26 Javascript
解决JS浮点数运算出现Bug的方法
Mar 12 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
jQuery中$(function() {});问题详解
Aug 10 Javascript
Bootstrap中表单控件状态(验证状态)
Aug 04 Javascript
JS实现超简单的汉字转拼音功能示例
Dec 22 Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 Javascript
详解如何使用koa实现socket.io官网的例子
Nov 04 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 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
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
python操作MongoDB基础知识
2013/11/01 Python
python使用folium库绘制地图点击框
2018/09/21 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
办公室保洁员岗位职责
2013/12/02 职场文书
护理学专业推荐信
2013/12/03 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
《春雨》教学反思
2014/04/24 职场文书
合作协议书模板
2014/10/10 职场文书
党员三严三实心得体会
2014/10/13 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
创业计划书详解
2019/07/19 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers