pls-00302: 必须声明 组件_vue组件
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
属性goods
,goods
是一个对象,在传值时需要使用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>
注意
给组件传递事件的流程:
- 先在外部定义需要传入的事件,如根实例的
buyGoods
- 将该事件传入组件,
@buy-goods="buyGoods"
注意buy-goods
是自定义事件名(不要使用大写字母) - 组件使用实例的
$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、生命周期
说明
created
和mounted
的区别created
是把vue的实例初始化,只存在js内存的一个变量而已,并没有渲染;mounted
是真正在页面上绘制完成,页面已经渲染完成,这个时候才可以操作DOM元素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组件相关推荐
- c++中获取蓝图组件_Vue组件通信方式居然有这么多?你了解几种
作者:梨香 链接:https://juejin.im/post/6887709516616433677 vue组件通信的方式,这是在面试中一个非常高频的问题,我刚开始找实习便经常遇到这个问题,当时只知 ...
- angularjs1访问子组件_vue 组件通信看这篇就够了(12种通信方式)
vue 组件间的通信是 vue 开发中很基础也十分重要的部分,作为使用 vue 的开发者每天都在使用.同时,vue 通信也是面试中非常高频的问题,有很多面试题,都是围绕通信展开. 本文会介绍常见的通信 ...
- iview 级联选择组件_vue组件递归渲染实例
文章选自我的语雀专栏<不造点轮子你可能都不知道的前端技巧>, 如果你喜欢的话可以关注我的语雀专栏https://www.yuque.com/u548790/technique,或者关注我的 ...
- 基于vue的组织架构树组件_Vue组件基于D3.js布局显示树
基于vue的组织架构树组件 Vue.D3.tree (Vue.D3.tree) Update documentationVue components to display graphics based ...
- vue中文翻译拼音组件_Vue组件可简化文本的翻译方式:通过内联翻译
vue中文翻译拼音组件 @ alidrus / vue-simple-inline-translation (@alidrus/vue-simple-inline-translation) A Vue ...
- iview 级联选择组件_Vue组件库大对比--HeyUI, iView, Element
目前,市面上主流的Vue组件库大概就是iview, element. 当然,heyui不在范围内,38个star屈指可数,大部分还是认识的同事. 更可恶的还是骗不来后端同学的star,心塞. 求Sta ...
- uniapp 子组件 props拿不到数据_Vue组件间的几种通信方式
前言 最近在刷面试题时,看见这个问题便做了个总结,欢迎各位补充!!! 为了更好的阅读性,请使用掘金访问 1.props & $emit--适用于父子组件通信 父组件通过prop向子组件传递数据 ...
- [react] 在React中声明组件时组件名的第一个字母必须是大写吗?为什么?
[react] 在React中声明组件时组件名的第一个字母必须是大写吗?为什么? 必须,React根据首字母是否大写来区分react组件还是dom元素 个人简介 我是歌谣,欢迎和大家一起交流前后端知识 ...
- vue 修改div宽度_Vue 组件通信方式及其应用场景总结(1.5W字)
前言 相信实际项目中用过vue的同学,一定对vue中父子组件之间的通信并不陌生,vue中采用良好的数据通讯方式,避免组件通信带来的困扰.今天笔者和大家一起分享vue父子组件之间的通信方式,优缺点,及其 ...
- React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期
React简介: 前面只是简单介绍移动APP开发,后面还会继续深入介绍移动app开发:其中想要用ReactNative开发出更出色的应用,那么就得学好React,下面将介绍React: React 是 ...
最新文章
- 微信和支付宝支付模式详解及实现(.Net标准库)
- 【Python-ML】SKlearn库RANSAC拟合高鲁棒性回归模型
- c++ uint32转为int_【转】用python将GBK编码文件转为UTF-8编码文件
- STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压
- php 从字符中随机挑一个数,php 对中文字符串的处理- 随机取出指定个数的汉字...
- 【BZOJ】3779 重组病毒
- 数学家看到就把持不住,高斯被它迷得神魂颠倒,2600年的数学史里的一个奇迹……...
- Java引用类型——强引用、软引用、弱引用和虚引用
- php 动态生成文件,php动态程序生成静态文件示例
- 再谈迭代器,生成器,yield,及和类的使用
- 大学c语言基本程序,一个大学C语言试题的简单实现--员工信息管理程序
- 9.6-9.7 awk
- 如何下载msdn上面的操作系统镜像
- 墨刀导出的html可以修改,怎么把墨刀的原型复制出来
- 判断是手机端/pc端
- 【pytorch】Conv2d()里面的参数bias什么时候加,什么时候不加?
- 大数据智能分析(BI)平台设计1---基本概念
- linux 分区怎样缩小,如何缩小磁盘分区大小
- 项目研发,有哪些好用的免费脑图工具软件
- 响应式织梦模板SEO优化教程资讯类网站
热门文章
- git+coding.net记录篇
- Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(转)
- [20151014]关于result cache.txt
- Scala 深入浅出实战经典 第91讲:Akka第一个案例动手实战架构设计
- 【UIKit】键盘设计2
- eclipse创建测试apk文件的测试工程,报错java.lang.NullPointerException
- 42. Element hasChildNodes() 方法
- 31. Element previousSibling 属性
- 25. Location hash 属性
- php中time()与$_SERVER[REQUEST_TIME]用法区别