javascript - 子组件中的变异道具
问题描述
在我的父 Vue 页面中,我在FormInput
表单中调用了
新的.vue
<b-form @submit.prevent="submit">
<FormInput :name="name"/>
<b-button @click="submit">Save</b-button>
<b-form>
<script>
import FormInput from '~/components/Insiders/FormInput';
export default {
components: {
FormInput
},
data() {
return {
name: 'User A'
}
},
methods: {
submit(event) {
console.log(this.name)
}
}
}
</script>
组件/内部人员/FormInput.vue
<b-form-input v-model="name" type="text"></b-form-input>
<script>
export default {
props: {
name: { type: String, required: true }
}
}
</script>
我收到一个错误: 避免直接改变道具,因为每当父组件重新渲染时,该值都会被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“名称”
我在这里期待的是,当我从 new.vue 更改输入中的值时,我应该能够在单击提交按钮时 console.log 新的 name 值。
我该如何解决这个问题?
解决方案
此用例的正确方法是让您为组件 FormInput 支持 v-model。
本质上,您正在为用户输入构建一个组件。在这种情况下,组件应该接受 input prop 并发布它的值。如果您使用 v-model,两者都可以作为单一配置完成。(“输入”和“输出”配置有单个 v-model 属性)。
参考这些文章:
https://alligator.io/vuejs/add-v-model-support/
https://scotch.io/tutorials/add-v-model-support-to-custom-vuejs-component
编辑:
v-model 方法使 FormInput 组件易于使用。所以,New.vue 的改动很简单:
<b-form @submit.prevent="submit">
<FormInput :v-model="name"/>
<b-button @click="submit">Save</b-button>
<b-form>
<script>
import FormInput from '~/components/Insiders/FormInput';
export default {
components: {
FormInput
},
data() {
return {
name: 'User A'
}
},
methods: {
submit(event) {
console.log(this.name)
}
}
}
</script>
但是,FormInput 组件仍然需要做一些额外的工作,以免改变实际输入。
<b-form-input :value="value" @input='updateVal' type="text"></b-form-input>
<script>
export default {
props: {
value: { type: String, required: true }
},
methods: {
updateVal: function(val){
this.$emit('input', val);
}
}
}
</script>
推荐阅读
- monaco-editor - 如何读取网络工作者内部的数据?
- r - 使用 data.table 粘贴列时如何忽略 NA?
- python - 如何将更改/更新数据传递到另一个弹出窗口?
- gzip - 如何在 C++ 中将 .json 文件压缩成 .json.gz 文件格式?
- sql - PostgreSQL 中 DATEADD 的等价物?
- php - 发布请求后我的会话被破坏
- android - 如何在android项目中使用不同的google-services.json文件添加不同风格的相同应用程序(想要克隆应用程序)?
- excel - 如果没有找到结果如何停止处理
- java - RedisHttpSession 正在为来自同一浏览器的请求创建不同的 sessionId
- powershell - 在 powershell 脚本中捕获错误