关于修改props属性的问题 #8256
Replies: 3 comments 4 replies
-
推荐不等于强制。 虽然不推荐直接修改props的属性,但是这种写法在Vue中是允许的,并且会生效。这是因为Vue在处理props时,会将其转换为响应式的数据,从而使得当props的值发生变化时,子组件会自动更新。因此,如果你直接修改props的属性,虽然不符合Vue的单向数据流的原则,但是Vue仍然会将其视为一个普通的数据变化,从而使得子组件重新渲染。 然而,直接修改props的属性可能会导致父组件的状态变得不可预测,因此不推荐这种做法。如果你确实需要在子组件中修改props的值,可以考虑使用一个本地的数据属性来保存props的值,并在子组件中对本地数据属性进行修改,然后通过emit方法将修改后的值传递给父组件。这样既可以遵循单向数据流的原则,又可以实现你的需求。 |
Beta Was this translation helpful? Give feedback.
-
我抛出一个例子,使用例子来说明可能最直观一点。楼主的用法也是我经常在项目中用的,最常用在封装的一个特定模型的表单组件中: <!-- UserForm.vue -->
<template>
<form @submit="submit">
<input type="text" v-model="user.name">
<input type="number" v-model="user.age">
<button type="submit">Submit</button>
</form>
</template>
<script setup lang="ts">
const props = defineProps<{
syncUser: { name: string, age: integer } // 取这么个属性名是为了向调用者告知一下内部的属性值会被子组件改掉
}>()
const emit = defineEmits{
(e: 'submit': user: { name: string, age: integer })
}()
const user = computed(() => props.syncUser)
function submit() {
emit('submit', props.user)
}
</script> 调用者如果没有什么特殊的要求,则直接使用即可: <template>
<UserForm :sync-user="user" @submit="submit"></UserForm>
</template>
<script setup lang="ts">
const user = ref({ name: '', age: 0 })
const submit = async function(user) {
await remoteSave({ user: user })
}
</script> 如果按照 Vue 官方推荐的不要修改属性的值的方式,大伙可以再贴一段代码比较一下。如果代码复杂度没有提高,则可以推荐官方的做法。如果代码复杂度确实提高了,那这种办法还是有方便的地方。我现在只有一个疑问,官方教程中说到:
这里说的是有较大的性能损失,这是因为什么呢?现在 Vue 3 应该没有这种奇怪的限制了吧。还是说官方为了吸引我们不要修改对象属性而故意吓我们的一种说法? |
Beta Was this translation helpful? Give feedback.
-
如果这个user中比如name,在父组件中使用了,然后子组件比如input中修改了这个name,那么这个时候势必父和子都会进行更新,这个时候更新父是完全没有必要的,完全可以一开始把name放在一个ref中,然后在input修改,等待最终这个子组件修改完成提交的时候,比较提交按钮的时候,在把这个数据提交到父级。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
官方文档推荐的是数据单项流思想,也就是在子组件不能直接修改props的属性,也就是父/祖父,传递过来的值,但是有些场景直接修改props里面的属性会变得简单的多,有些场景用emit方式/vuex不太好处理,反而直接修改props里面的属性更便捷,而且也没有发生什么事,请问下这种做法是否可取?既然不推荐直接修改props的属性,那么为什么这种写法会生效并且存在。
Beta Was this translation helpful? Give feedback.
All reactions