详解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 相关文章推荐
prototype Element学习笔记(篇一)
Oct 26 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
基于JS实现PHP的sprintf函数实例
Nov 14 Javascript
详解AngularJS中ng-src指令的使用
Sep 07 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
Node.js中看JavaScript的引用
Apr 22 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
Jun 12 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
深入理解Puppeteer的入门教程和实践
Mar 05 Javascript
一个小时快速搭建微信小程序的方法步骤
Apr 15 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
Sep 05 Javascript
js中实现继承的五种方法
Jan 25 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网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
微信小程序 实现点击添加移除class
2017/06/12 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
python 默认参数问题的陷阱
2016/02/29 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
快速了解Python相对导入
2018/01/12 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
美国在线工具商店:Acme Tools
2018/06/26 全球购物
军训自我鉴定100字
2014/02/13 职场文书
党风廉政承诺书
2014/03/27 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
JAVA springCloud项目搭建流程
2022/05/11 Java/Android