<template>
<el-select
class="mr__m"
:value="value"
placeholder="请先选择分类"
filterable
@input="change($event)"
>
<el-option
v-for="(option, index) in list"
:key="'categoryOptions' + index"
:label="option.dictValue"
:value="option.dictKey"
/>
</el-select>
</template>
<script>
export default {
props: {
list: {
type: Array,
default: _ => []
},
value: {
type: [String, Object]
}
},
methods: {
change(val) {
this.$emit('input', val)
}
}
}
</script>
这种封装方式是不是违背了数据单项流动的原则?好一点的写法应该是怎么样的?
谢谢。
1
wu67 2022-12-23 17:28:17 +08:00
按我的理解, 单向的意思是他只能用父传给子、祖先传给后代, 同时不应直接改这个值.
直接改可能会有什么情况呢? 界面更新不及时(响应性问题)、追踪困难(无法知道是哪里的代码变更了数据). 你可以直接 watch value, 然后赋值给另一个变量 viewValue, select 绑定 viewValue, select 组件选中的时候, 通过事件通知父组件变更 value 的值. |
2
IvanLi127 2022-12-23 20:11:46 +08:00 via Android
看起来不违反,能圈个重点吗?
|
3
zsj1029 2022-12-23 22:21:16 +08:00 via iPhone
强烈尝试 mithril.js 可以用 jsx 语法,小而强大,前端目前越发的无限复杂,90%都在做无用功
|
4
zsj1029 2022-12-23 22:29:55 +08:00 via iPhone
@zsj1029 angular vue react 都用来写过项目,最后发现 mithriljs 足矣,当然自己要会写 ui ,如果只是套三大的各类现成 ui 库,还是拿来主义效率高
|
5
V1Eerie 2022-12-23 22:31:45 +08:00
我觉得没有违反。最好保证每次改变值的时候都能及时更新。
|
6
jqtmviyu 2022-12-23 22:49:01 +08:00
我觉得没有违反。 数据还是在父组件那里管理,子组件只是通知父组件更新。
如果子组件直接把原始数据改了,这份数据又在其他地方用到,追踪起来就乱了,根本不知道是哪位子组件改的。 |
7
bojackhorseman 2022-12-24 00:12:17 +08:00 via iPhone
这样写 vue 会警告的吧,建议用 writeable computed 来处理,get 返回 value 的值,set 调用 this.$emit(input, val)
|