注册一个组件
有两种方式可以注册一个组件,第一种是全局注册,第二种是局部注册
# 全局注册 Vue.component('my-component',{ template: '<span>Hello</span>' }) # 局部注册 var child = { template: '<span>Hello</span>' } new Vue({ // ··· components:{ my-component: child } })
注意:组件的注册必须要在Vue实例创建之前
使用组件
<div id="app"> <my-component></my-component> </div>
当我们需要使用到data时,data必须是一个函数,否则将会报错,这是Vue的一个规则,如下
Vue.component('my-component',{ template: '<span>{{message}}</span>', data:function(){ return {message:'hello'} } })
组件间消息传递
当我们封装了组件A,但是组件A又嵌套了组件B,这时候组件AB形成了父子组件的关系,我们应该怎么来让父组件传递消息给子组件呢,这里用到了一个属性值props,如下
Vue.component('my-component',{ props: ['message'] template: '<span>{{message}}</span>' }) # 通过props传递消息给子组件 <my-component message="Hello"></my-component>
上面的例子,我们通过props传递了参数给子组件,确实能改变子组件的值,但是,假如我们有这样一个要求,props的值是动态改变的,那么这种静态字面量传递参数的方式就不能满足我们的需求了。如下将说明如何进行动态的props值设定
<div id="app"> <input v-model="parentMsg"><br> <my-component v-bind:message="parentMsg"> </div>
这里通过v-bind的命令,将我们的message与parentMsg进行绑定,这样,当我们的parentMsg改变时,message将能实时改变
自定义事件
父子组件之间如果通过props来传递数据的话,那么似乎只能进行单向的数据传递,只能从父组件向子组件传递,假如我们需要从子组件传递消息回去,那么就需要用到自定义事件了
# 使用v-on绑定自定义事件 Vue.component('my-component',{ template: '<button v-on:click="increment">{{counter}}</button>', data: function(){ return {counter: 0} }, methods: { increment: function(){ this.counter += 1; this.$emit(increment); } } }) new Vue({ el: '#app', data: { // ··· total:0 }, methods: { // ··· incrementTotal: function(){ this.total += 1; } } })
<div id="app"> // ··· <p>{{total}}</p> <my-component v-on:increment="incrementTotal"></my-component> </div>
这里,我们点击按钮,按钮的显示的数值将会改变,同时,total的值也会动态的改变,这就是子组件回传数据的实例,我们点击按钮时,将会首先执行button的onclick方法,在onclick方法里面,通过this.$emit('increment')来执行我们自定义的事件,假如我们需要在$emit中添加参数,那么我们就要在$on()中进行回调的处理
我们接下来自定义一个表单输入控件,我们在输入框中输入信息,同时在P标签中显示出来。
这里我们平时使用的
v-model="message"
其实是下面语句的一个简化版本,也就是语法糖
v-bind:value="message" v-on:input="message = arguments[0]"
或者
v-bind:value="message" v-on:input="message = $event.target.value"
那么自定义表单控件我们需要干什么呢?
为了让v-model生效,我们需要在子组件中定义一个value的属性,还有一个监听新值产生的input事件
来看看我们的自定义控件
复制代码 代码如下:
<my-input label="Message" :value="message" @input="message = arguments[0]"></my-input>
在上面,我们通过 :value="message" 绑定一个value使其与上一级组件的message相挂钩,后面这个 v-on:input 是子组件定义的事件,事件名可以自己定义,arguments[0] 是组件自定义时传入的第一个参数
完整代码如下:
# 使用自定义事件的表单输入控件 Vue.component('my-input',{ template: ' <div> <label>{{label}} :</label> <input v-bind:value="value" v-on:input="onInput"></input> </div> ' , props:['value','label'], methods:{ onInput:function(event){ this.$emit('input',event.target.value); // this.$emit('input') } } })
<div id="app"> <p>{{message}}</p> <my-input label="Message" v-model="message"></my-input><br> <!-- <my-input label="Message" :value="message" @input="message = arguments[0]"></my-input> --> </div>
我们在定义内部事件时,调用到了$emit(),为了让message能动态改变,我们需要将输入的参数回传回去,这样才能使外部组件与我们的表单控件显示一致
Vue组件的就先写到这,接下来还有事件分发,就接下来再写。由于理解的不同,可能有写得不好的,所以有错误的地方请指正。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]