vue组件

1、创建vue组件

建组件的方式有两种,一种是局部组件,一种是全局组件

1.1局部组件

介绍

​ 通过对象的方式创建了一个组件,由对象的template属性指定组件的结构,然后组件必须在根实例中的components属性中注册才能实现引用,这种创建方式称为局部组件

代码示例

<div id="app"><!-- 3.引用组件 --><component-a></component-a>
</div><script>
// 1.创建组件
var ComponentA = { template: `<div>hello vue</div>` }new Vue({el: '#app',// 2.注册局部组件components: {'component-a': ComponentA,}
})
</script>

1.2 全局组件

介绍

全局组件使用Vue.component的方法创建,第一个参数为组件名,第二个参数是对象由template属性指定组件结构,并且不需要通过components属性注册就能直接调用

代码示例

<div id="app"><!-- 2.引用组件 --><component-a></component-a>
</div><script>
// 1.创建全局组件
Vue.component("component-a", {template: `<div>hello vue</div>`
})new Vue({el: '#app'
})
</script>

注意

对比后可以明显发现两者的创建方式不一样,

可以理解为需要在components中注册才可以在页面调用的为局部组件,使用Vue.component的方法创建为全局组件

1.3 组件实例的属性

介绍

​ 不管是局部组件还是全局组件中,我们留意到了它们共同存在一个对象,对象下都是通过template来指定结构,但是这个对象可远不止只有template这个属性,它包含了根实例可用的所有属性(包data、methods、computed、watch等), 也就是说组件也是一个Vue实例对象。

比如在组件定义data属性

代码示例

<div id="app"><!-- 2.引用组件 --><component-a></component-a>
</div><script>
// 1.创建全局组件
Vue.component("component-a", {data: function(){return {message: "hello vue"}},template: `<div>{{message}}</div>`
})new Vue({el: '#app'
})
</script>

注意

​ 组件中的data数据声明和根实例中不一样, 组件的data声明必须是一个函数,在函数中返回一个对象,该对象才是组件的数据,data数据可以在template中渲染。除了data的定义和根实例不一样外,其他属性都是一样的。

2、组件传值

2.1 组件的props

介绍

​ 组件传值的关键属性props,实现步骤:先在组件中通过props声明可接收的属性,然后在引用组件时传递对应的属性和值

代码示例

<div id="app"><!-- 3.引用组件 --><goods-item title="原装正品 iphone x" price="10000"></goods-item><!-- 4.再次引用组件--><goods-item title="假一赔十 iphone 8" price="8000"></goods-item>
</div><script>
// 1.创建商品组件
Vue.component("goods-item", {// 2.定义propsprops: ["title", "price"],template: `<div><h4>{{title}}</h4><p>{{price}}</p></div>`
})new Vue({el: '#app'
})
</script>

注意

​ props的值是一个数组,里面声明了组件可接收的属性,如上例title,price,注意组件内部访问props的值和访问data中的值是一样的

2.2 动态的props值

介绍

​ 上例中我们发现props的属性都是属于一个商品的信息,但是一个商品的信息往往是使用对象来表示的,那么组件的props也是可以接收对象类型值的,并且有两种传递方式

  • 直接传递对象
  • 传递data数据

代码示例

1.直接传递对象

<div id="app"><!-- 3.引用组件 --><goods-item :goods="{title: '原装正品 iphone x', price: '10000'}"></goods-item><!-- 4.再次引用组件--><goods-item :goods="{title: '假一赔十 iphone 8', price: '8000'}"></goods-item>
</div><script>
// 1.创建商品组件
Vue.component("goods-item", {// 2.定义propsprops: ["goods"],template: `<div><h4>{{goods.title}}</h4><p>{{goods.price}}</p></div>`
})new Vue({el: '#app'
})
</script>

注意

​ 只需要声明一个props属性goodsgoods是一个对象,在传值时需要使用v-bind:或缩写:来传递动态值,如果不使用v-bind:,值会解释为普通的字符串

2.3 组件接收props的多种方法

介绍

​ 我们都是使用数组的方式定义组件的props,但其实定义props的方法有很多种,数组只是常用的一种

代码示例

Vue.component('my-component', {props: {// 基础的类型检查 (`null` 匹配任何类型)propA: Number,// 多个可能的类型propB: [String, Number],// 必填的字符串propC: {type: String,required: true},// 带有默认值的数字propD: {type: Number,default: 100},// 带有默认值的对象propE: {type: Object,// 对象或数组默认值必须从一个工厂函数获取default: function () {return { message: 'hello' }}},// 自定义验证函数propF: {validator: function (value) {// 这个值必须匹配下列字符串中的一个return ['success', 'warning', 'danger'].indexOf(value) !== -1}}}
})

3、组件传递事件

3.1 传递普通事件

介绍

​ 往上例的商品组件中新增一个购买商品的按钮,然后点击该按钮时触发外部传递过来的购买事件,之所以把购买事件封装到外部,是因为在大型的应用中往往有多个地方可以进行购买操作

代码示例

<div id="app"><!-- 2.传递事件, buyGoods是事件名 --><goods-item :goods="goods" @buy-goods="buyGoods"></goods-item>
</div><script>Vue.component("goods-item", {props: ["goods"],methods: {// 4.购买事件handleBuy: function(){// 5.主动触发传递的事件this.$emit("buy-goods");}},template: `<div><h4>{{goods.title}}</h4><p>{{goods.price}}</p><!-- 3.新增按钮,添加点击事件 --><button @click="handleBuy">立即购买</button></div>`})new Vue({el: '#app',data: {goods: {title: '原装正品 iphone x',price: 10000}},methods: {// 1.封装购买商品事件buyGoods: function(){alert("购买了商品")}}})
</script>

注意

给组件传递事件的流程:

  1. 先在外部定义需要传入的事件,如根实例的buyGoods
  2. 将该事件传入组件,@buy-goods="buyGoods"注意buy-goods是自定义事件名(不要使用大写字母)
  3. 组件使用实例的$emit方法主动触发事件,该方法接收要触发事件的事件名,如this.$emit("buy-goods");

3.2 子组件传值到父组件

介绍

组件之间是采用单向数据流,也就是父组件可以使用props往子组件传递数据,如果想在子组件中往父组件传递数据,可以通过事件方式实现。

代码示例

<div id="app"><goods-item :goods="goods" @buy-goods="buyGoods"></goods-item>
</div><script>Vue.component("goods-item", {props: ["goods"],methods: {handleBuy: function(){// 1.第二个参数可以传数据给父组件this.$emit("buy-goods", { title: this.goods.title });}},template: `<div><h4>{{goods.title}}</h4><p>{{goods.price}}</p><button @click="handleBuy">立即购买</button></div>`})new Vue({el: '#app',data: {goods: {title: '原装正品 iphone x',price: 10000}},methods: {// 2.通过参数接收子组件的数据buyGoods: function(data){alert("购买了商品:" + data.title)}}})
</script>

注意

​ 在子组件中使用this.@emit()触发事件时,可以通过参数传入数据,父组件事件中可接收对应的数据

3.3 兄弟组件传值

子传父》父传兄

3.4 自定义事件通讯

介绍

兄弟组件,跨层级组件都可以通过自定义事件来进行通讯

event.js

import Vue from 'vue'export default new Vue()

说明

1.Vue本身具有自定义事件的能力

2.event是new Vue()的实例,已经具备$on $emit自定义事件的能力,所以不需要引入eventBus

index父组件

<template><div><Input @add="addHandler"/><List :list="list" @delete="deleteHandler"/></div>
</template><script>
import Input from './Input' //子组件
import List from './List'  //子组件export default {components: {Input,List},data() {return {list: [{id: 'id-1',title: '标题1'},{id: 'id-2',title: '标题2'}]}},methods: {addHandler(title) {this.list.push({id: `id-${Date.now()}`,title})},deleteHandler(id) {this.list = this.list.filter(item => item.id !== id)}},created() {// eslint-disable-next-lineconsole.log('index created')},mounted() {// eslint-disable-next-lineconsole.log('index mounted')},beforeUpdate() {// eslint-disable-next-lineconsole.log('index before update')},updated() {// eslint-disable-next-lineconsole.log('index updated')},
}
</script>

Input 子组件

说明

通过event.$emit调用自定义事件获取其他组件传递的数据

<template><div><input type="text" v-model="title"/><button @click="addTitle">add</button></div>
</template><script>
import event from './event'export default {data() {return {title: ''}},methods: {addTitle() {// 调用父组件的事件this.$emit('add', this.title)// 调用自定义事件event.$emit('onAddTitle', this.title)this.title = ''}}
}
</script>

List 子组件

说明

通过event.$on绑定自定义事件并传递数据过去

<template><div><ul><li v-for="item in list" :key="item.id">{{item.title}}<button @click="deleteItem(item.id)">删除</button></li></ul></div>
</template><script>
import event from './event'export default {// props: ['list']props: {// prop 类型和默认值list: {type: Array,default() {return []}}},data() {return {}},methods: {deleteItem(id) {this.$emit('delete', id)},addTitleHandler(title) {// eslint-disable-next-lineconsole.log('on add title', title)}},created() {// eslint-disable-next-lineconsole.log('list created')},mounted() {// eslint-disable-next-lineconsole.log('list mounted')// 绑定自定义事件event.$on('onAddTitle', this.addTitleHandler)},beforeUpdate() {// eslint-disable-next-lineconsole.log('list before update')},updated() {// eslint-disable-next-lineconsole.log('list updated')},beforeDestroy() {// 及时销毁,否则可能造成内存泄露event.$off('onAddTitle', this.addTitleHandler)}
}
</script>

注意

绑定自定义事件的组件,要及时销毁该事件,否则可能造成内存泄露

4、生命周期

说明

  1. createdmounted的区别created是把vue的实例初始化,只存在js内存的一个变量而已,并没有渲染;mounted 是真正在页面上绘制完成,页面已经渲染完成,这个时候才可以操作DOM元素
  2. beforeDestroy 中可能要做什么
    解除绑定,销毁子组件以及事件监听

4.1 单个组件

  • 挂载阶段

    • beforeCreated
    • created
    • beforeMounted
    • mounted
  • 更新阶段
    • beforeUpdate
    • updated
  • 销毁阶段

    • beforeDestroy
    • destroyed

4.3 父子关系

  • 创建,渲染
    创建初始化实例是从渲染是从

    • 父 beforeCreated
    • 父 created
    • 父 beforeMounted
    • 子 beforeCreated
    • 子 created
    • 子 beforeMounted
    • 子 mounted
    • 父 mounted
  • 更新
    更上面类似

    • 父 beforeUpdate
    • 子 beforeUpdate
    • 子 updated
    • 父 updated
  • 销毁

    • 父 beforeDestroy
    • 子 beforeDestroy
    • 子 destroyed
    • 父 destroyed

pls-00302: 必须声明 组件_vue组件相关推荐

  1. c++中获取蓝图组件_Vue组件通信方式居然有这么多?你了解几种

    作者:梨香 链接:https://juejin.im/post/6887709516616433677 vue组件通信的方式,这是在面试中一个非常高频的问题,我刚开始找实习便经常遇到这个问题,当时只知 ...

  2. angularjs1访问子组件_vue 组件通信看这篇就够了(12种通信方式)

    vue 组件间的通信是 vue 开发中很基础也十分重要的部分,作为使用 vue 的开发者每天都在使用.同时,vue 通信也是面试中非常高频的问题,有很多面试题,都是围绕通信展开. 本文会介绍常见的通信 ...

  3. iview 级联选择组件_vue组件递归渲染实例

    文章选自我的语雀专栏<不造点轮子你可能都不知道的前端技巧>, 如果你喜欢的话可以关注我的语雀专栏https://www.yuque.com/u548790/technique,或者关注我的 ...

  4. 基于vue的组织架构树组件_Vue组件基于D3.js布局显示树

    基于vue的组织架构树组件 Vue.D3.tree (Vue.D3.tree) Update documentationVue components to display graphics based ...

  5. vue中文翻译拼音组件_Vue组件可简化文本的翻译方式:通过内联翻译

    vue中文翻译拼音组件 @ alidrus / vue-simple-inline-translation (@alidrus/vue-simple-inline-translation) A Vue ...

  6. iview 级联选择组件_Vue组件库大对比--HeyUI, iView, Element

    目前,市面上主流的Vue组件库大概就是iview, element. 当然,heyui不在范围内,38个star屈指可数,大部分还是认识的同事. 更可恶的还是骗不来后端同学的star,心塞. 求Sta ...

  7. uniapp 子组件 props拿不到数据_Vue组件间的几种通信方式

    前言 最近在刷面试题时,看见这个问题便做了个总结,欢迎各位补充!!! 为了更好的阅读性,请使用掘金访问 1.props & $emit--适用于父子组件通信 父组件通过prop向子组件传递数据 ...

  8. [react] 在React中声明组件时组件名的第一个字母必须是大写吗?为什么?

    [react] 在React中声明组件时组件名的第一个字母必须是大写吗?为什么? 必须,React根据首字母是否大写来区分react组件还是dom元素 个人简介 我是歌谣,欢迎和大家一起交流前后端知识 ...

  9. vue 修改div宽度_Vue 组件通信方式及其应用场景总结(1.5W字)

    前言 相信实际项目中用过vue的同学,一定对vue中父子组件之间的通信并不陌生,vue中采用良好的数据通讯方式,避免组件通信带来的困扰.今天笔者和大家一起分享vue父子组件之间的通信方式,优缺点,及其 ...

  10. React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期

    React简介: 前面只是简单介绍移动APP开发,后面还会继续深入介绍移动app开发:其中想要用ReactNative开发出更出色的应用,那么就得学好React,下面将介绍React: React 是 ...

最新文章

  1. 微信和支付宝支付模式详解及实现(.Net标准库)
  2. 【Python-ML】SKlearn库RANSAC拟合高鲁棒性回归模型
  3. c++ uint32转为int_【转】用python将GBK编码文件转为UTF-8编码文件
  4. STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压
  5. php 从字符中随机挑一个数,php 对中文字符串的处理- 随机取出指定个数的汉字...
  6. 【BZOJ】3779 重组病毒
  7. 数学家看到就把持不住,高斯被它迷得神魂颠倒,2600年的数学史里的一个奇迹……...
  8. Java引用类型——强引用、软引用、弱引用和虚引用
  9. php 动态生成文件,php动态程序生成静态文件示例
  10. 再谈迭代器,生成器,yield,及和类的使用
  11. 大学c语言基本程序,一个大学C语言试题的简单实现--员工信息管理程序
  12. 9.6-9.7 awk
  13. 如何下载msdn上面的操作系统镜像
  14. 墨刀导出的html可以修改,怎么把墨刀的原型复制出来
  15. 判断是手机端/pc端
  16. 【pytorch】Conv2d()里面的参数bias什么时候加,什么时候不加?
  17. 大数据智能分析(BI)平台设计1---基本概念
  18. linux 分区怎样缩小,如何缩小磁盘分区大小
  19. 项目研发,有哪些好用的免费脑图工具软件
  20. 响应式织梦模板SEO优化教程资讯类网站

热门文章

  1. git+coding.net记录篇
  2. Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(转)
  3. [20151014]关于result cache.txt
  4. Scala 深入浅出实战经典 第91讲:Akka第一个案例动手实战架构设计
  5. 【UIKit】键盘设计2
  6. eclipse创建测试apk文件的测试工程,报错java.lang.NullPointerException
  7. 42. Element hasChildNodes() 方法
  8. 31. Element previousSibling 属性
  9. 25. Location hash 属性
  10. php中time()与$_SERVER[REQUEST_TIME]用法区别