详解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 相关文章推荐
新手常遇到的一些jquery问题整理
Aug 16 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
Aug 04 Javascript
AngularJS directive返回对象属性详解
Mar 28 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
详解一个基于套接字实现长连接的express
Mar 28 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
Aug 27 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
Sep 11 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
德生9700DX电路分析
2021/03/02 无线电
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
Maps Javascript
2007/01/22 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
详解Vue的ref特性的使用
2020/01/24 Javascript
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
python3中str(字符串)的使用教程
2017/03/23 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
Python datetime 如何处理时区信息
2020/09/02 Python
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
销售员个人求职的自我评价
2014/02/10 职场文书
批评与自我批评总结
2014/10/17 职场文书
服务明星事迹材料
2014/12/29 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
行政处罚告知书
2015/07/01 职场文书
新人入职感言
2015/07/31 职场文书