您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

vue可以修改prop中的值吗

2024/4/3 6:28:04发布20次查看
vue中不可以直接修改prop中的值,若直接修改vue会产生警告,且修改该属性值并不能修改父组件对应的变量;但是可以通过触发子组件事件,父组件监听该事件并执行修改父组件的函数,通过监听子组件事件做到双向数据绑定来实现修改prop中的值。
本教程操作环境:windows10系统、vue3版、dell g3电脑。
vue可以修改prop中的值吗在vue中,prop是可以接受由父组件传递给子组件的属性,但prop无法进行修改的。
如果prop被强制修改,会有警告
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
另外,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,vue 会在浏览器的控制台中发出警告。
尝试通过下面的方法直接修改属性值
this.$props.modelvalue = true;
vue 将提出警告
set operation on key “modelvalue” failed: target is readonly.
且修改该属性值并不能修改父组件对应的变量,仅仅适用于基础数据类型。
注意在 javascript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态,且 vue 无法为此向你发出警告。作为一个通用规则,应该避免修改任何 prop,包括对象和数组,因为这种做法无视了单向数据绑定,且可能会导致意料之外的结果。
vue3 props 文档
正确的修改方法是触发子组件事件,父组件监听该事件并执行修改父组件的函数,以 v-model 为例,v-model 本身就是传递给子组件的 modelvalue 属性,然后监听 update:modelvalue 事件来做到双向数据绑定,所以我们也可以通过该方法来在代码中修改 modelvalue
this.$emit(update:modelvalue, !this.$props.modelvalue);
v-model 将自动监听 update:modelvalue 事件并将 modelvalue 修改为触发事件时传递的参数值(即 $emit 的第二个参数)。
需要注意的是,这种通过触发事件-监听事件的数据流模式并不能马上生效,如果使用以下代码
this.$emit(update:modelvalue, !this.$props.modelvalue);console.log(this.$props.modelvalue);
会发现输出到控制台的仍然是 modelvalue 原先的值,这是因为触发事件-监听事件的模式下属性值的修改需要时间,改用以下代码会发现输出正常:
this.$emit(update:modelvalue, !this.$props.modelvalue);settimeout(()=> {console.log(this.$props.modelvalue)}, 1000)
实践由于 vant 只实现了左边放 label 的输入框,想基于此实现一个 label 在右边的输入框
vant3 field 文档
这其中遇到的问题除了把 label 右置并根据 label 的内容自适应宽度外,就是 vant 中的 <van-field /> 与我需要实现的 <right-label-input /> 以及放置 <right-label-input> 的父组件之间的数据流了。
错误做法为了能够与 <van-field /> 一致使用 v-model ,我在 <right-label-input /> 下设置 modelvalue 属性,然后将 <van-field> 的 v-model=modelvalue
<template><van-field :placeholder="placeholder" :name="name" v-model="modelvalue" :disabled="disabled"/></template><script>export default {    name: rightlabelinput,    props: {        modelvalue: ,    },}</script>
无疑,这种做法违背了单向数据流原则,在 vanfield 修改时将直接影响 rightlabelinput 的 modelvalue 值,而 modelvalue 是 rightlabelinput 的属性,不能直接修改。
可能正确的做法<template>    <van-field :placeholder="placeholder" :name="name" v-model="input" :disabled="disabled" /></template><script>export default {    name: rightlabelinput,    props: {        placeholder: ,        name: ,        label: ,        modelvalue: ,        disabled: {            type: boolean,            default: false        }    },    data() {        return {            input: this.modelvalue, // 绑定到 data 的变量,防止直接修改 props        }    },    beforemount() {        this.input = this.modelvalue    },    watch: {        input(newinput, oldinput) {            this.$emit(update:modelvalue, newinput); // 监听 input 在修改时发起事件,由父组件修改 modelvalue 的值        },        modelvalue(newvalue, oldvalue) {            this.input = newvalue;        }    }}</script><style scoped></style>
关键词:单向数据流
【相关推荐:《vue.js教程》】
以上就是vue可以修改prop中的值吗的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product