下面我将使用Vue自带的属性实现简单的双向绑定。
下面的例子就是利用了父组件传给子组件(在子组件定义props属性,在父组件的子组件上绑定属性),子组件传给父组件(在子组件使用$emit()属性定义一个触发方法,在父组件上的子组件监听这个事件)。
import Vue from 'vueEsm' var Com = { name:'Com', props:['val'], template:`<input type='text' @input='handleInput'/>`, methods: { handleInput(e){ this.$emit("input",e.target.value); } }, } new Vue({ el:'#app', data() { return { value:'' } }, components:{ Com }, template:` <div> <Com @input='post' :val='value'></Com> </div> `, methods:{ post(data){ this.value=data; } } })
上面这个例子,在input标签上每次输入时触发原生事件input,在这个事件上绑定了一个handleInput方法,事件每次触发都会执行方法里的$emit属性。该属性里面第一个参数可以定义一个事件名,第二个参数可以传一个参数。这里我们把每次输入的值e.target.value传进去。在父组件的子组件上监听这个事件,定义一个post方法,方法的参数就是传入的数据。然后我们在父组件的data属性里定义一个存储值的变量value。将刚才传入的参数赋给这个变量value。最后在父组件的子组件上绑定一个自定义属性,比如val。将value传给val。在子组件定义一个props属性接受这个val。
这个例子对于理解父组件与子组件传值特别重要。
下方举例说明了我的一个自定义mySelect的实现过程:
<template> <div class="select"> <div class="input" @click="collapse=!collapse"> <span v-if="currentValue">{{currentLabel||currentValue}}</span> <span v-else class="placeholder">{{placeholder}}</span> <span :class="collapse"></span> </div> <div class="option-list" v-show="!collapse"> <div class="option-item" v-for="item in data" :key="item.id" @click="chooseItem(item)">{{item[itemLabel"mySelect", props: [ 'value', 'placeholder', 'data', 'itemLabel', 'itemValue' ], data() { return { collapse: true, currentValue: '', currentLabel: '', } }, watch: { value: { immediate: true, handler(value) { this.currentValue = value; this.$emit('input', value); this.data.forEach(item => { if (item[this.itemValue "scss" scoped> .select { position: relative; .input { width: 100%; height: 30px; line-height: 30px; background-color: #fff; border: 1px solid #02b4fe; border-radius: 0 3px 3px 0; padding-left: 10px; color: #666; position: relative; .placeholder { color: #aaa; } } .arrow-down { width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 8px solid #02b4fe; position: absolute; right: 5px; top: 10px; } .arrow-up { width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 8px solid #02b4fe; position: absolute; right: 5px; top: 10px; } .option-list { max-height: 200px; overflow-y: scroll; position: absolute; top: 2rem; left: 0; z-index: 5; width: 100%; padding: 0 5px; font-size: 10px; color: #aaa; background-color: #fff; text-align: left; box-shadow: 0 0 5px rgba(0, 0, 0, .1); border: 1px solid rgb(79, 192, 232); .option-item { text-align: center; line-height: 1.5rem; } } } </style>
如上所示,当声明了mySelect组件之后,在项目中实际使用时,就可以如下所示直接使用:
<template> <mySelect v-model="testValue" placeholder="请选择" :data="testArr" item-label="id" item-value="name"></mySelect> </template> <script> import mySelect from './mySelect' export default{ components:{ mySelect }, data(){ return { testValue:'', testArr:[] } }, mounted(){ //预置select的下拉选择基础数据,数据为对象数组,包含id和name属性 } } </script>
以上就是一个简单的自定义双向绑定组件的实现,包括简单的使用过程。在vue中的自定义组件,关于props的声明时,还是尽量使用官方建议的对象方式,可以声明属性的默认值和数据类型。我这边偷懒了用的是props的字符串数组简写方式,但是这样的话对使用组件时的错误调试不利。所以,尽量不要学我偷懒噢,亲~~~
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月15日
2024年11月15日
- 孙露《怕什么孤单3CD》深圳音像[WAV分轨]
- s14全球总决赛目前是什么结果 s14全球总决赛赛程结果图一览
- s2TPA夺冠五人名单都有谁 tpa战队s2夺冠队员名单一览
- s13wbg战队成员都有谁 wbg战队s13成员名单一览
- 网友热议《幻兽帕鲁》停售、赔千万日元:那也赚麻了 不亏
- 这谁顶得住 《最终幻想7:重生》尤菲3D作品穿上终极芙蕾娜衣服
- 外媒称PS5pro违背承诺:《蜘蛛侠2》根本没法4K60帧
- 群星.2007-中文十大金曲30周年纪念专辑【RTHK】【WAV+CUE】
- 杨林.1989-留一点爱来爱自己【综一唱片】【WAV+CUE】
- 南合文斗.2007-陪君醉笑三千尘鸟人唱片】【FLAC+CUE】
- 群星《我们的歌第六季 第1期》[320K/MP3][90.72MB]
- 群星《我们的歌第六季 第1期》[FLAC/分轨][456.01MB]
- 李雨寰《Break Free》[320K/MP3][98.39MB]
- 草蜢.2001-《真经典》环球唱片[WAV+CUE]
- 群星.2009-第4届2008十大发烧唱片精选[FLAC+CUE]