下面我将使用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的字符串数组简写方式,但是这样的话对使用组件时的错误调试不利。所以,尽量不要学我偷懒噢,亲~~~
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 林隆璇.1989-愤怒的情歌【巨石】【WAV+CUE】
- 勤琴《海上花》[DTS-WAV分轨]
- 群星《歌声有故事》[DTS-WAV分轨]
- [发烧人声]群星《邂逅》DTS-WAV
- 艻打绿《夏/狂热(苏打绿版)》[320K/MP3][106.42MB]
- 艻打绿《夏/狂热(苏打绿版)》[FLAC分轨][574.2MB]
- 黄雨勳《魔法列车首部曲》[320K/MP3][33.1MB]
- 李蕙敏.2014-记得·销魂新歌+精丫乐意唱片】【WAV+CUE】
- 谢金燕.1995-含泪跳恰蔷冠登】【WAV+CUE】
- 于文文.2024-天蝎座【华纳】【FLAC分轨】
- 黄雨勳《魔法列车首部曲》[FLAC/分轨][173.61MB]
- 群星《歌手2024 第13期》[320K/MP3][50.09MB]
- 群星《歌手2024 第13期》[FLAC/分轨][325.93MB]
- 阿木乃《爱情买卖》DTS-ES【NRG镜像】
- 江蕾《爱是这样甜》DTS-WAV