Vue解决子组件修改父组件props参数不可逆问题

直接赋值props里面数据会导致如下错误

解决这个bug有以下两种方法,

一:使用$emit函数

1、父组件可以使用 props 把数据传给子组件。
2、子组件可以使用 $emit 触发父组件的自定义事件

修改后:

父组件

//html
<tree-list :typeList="typeList" :subTypeList="subTypeList" @showSubType="updateSubType"></tree-list>

//methods
methods:{
			updateSubType(data){//子组件触发事件
			this.subTypeList = data;//改变了父组件的值
			console.log('subTypeList:'+this.subTypeList)
	 },
}

子组件

this.$emit("showSubType",res.data.data)

二:从新定义一个属性去接收props参数值

//html
<view  class="nav-right-item" v-for="(item,index) in newSubTypeList" :key="index" ></view>


//js
props:{
			
	subTypeList:{
		type:Array,
		default:function(){
			return []
			}
		},
	},
data() {
	return {
		newSubTypeList:this.subTypeList
	}
}

但这是会发现传过来的值不会显示,这是因为data只执行一次,所以需要实时去监听参数,用watch函数

watch: {
	subTypeList(val){
		this.newSubTypeList = val;
	}
}

 

Vue 3 中,组件是不允许直接修改组件props 的。这是因为 Vue 的设计理念是单向数据流,组件通过 props 将数据传递给组件组件可以读取这些数据但不能直接修改它们。 如果你需要在组件修改组件的数据,你可以通过在组件中触发一个自定义事件,然后在组件中监听该事件并相应地更新数据。 下面是一个示例: ```vue <!-- ParentComponent.vue --> <template> <div> <ChildComponent :message="message" @update-message="updateMessage" /> <p>Message from child component: {{ message }}</p> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { message: 'Hello from parent' }; }, methods: { updateMessage(newMessage) { this.message = newMessage; } } }; </script> ``` ```vue <!-- ChildComponent.vue --> <template> <button @click="changeMessage">Change Message</button> </template> <script> export default { props: ['message'], methods: { changeMessage() { const newMessage = 'Hello from child'; this.$emit('update-message', newMessage); } } }; </script> ``` 在上面的示例中,组件 `ParentComponent` 传递了 `message` 给组件 `ChildComponent` 的 props组件中的按钮点击事件触发了 `changeMessage` 方法,在该方法中通过 `$emit` 方法触发了一个名为 `update-message` 的自定义事件,并将新的消息作为参数传递给组件。在组件中监听了 `update-message` 事件,当事件触发时,调用 `updateMessage` 方法来更新组件的 `message` 数据。 这样,当组件中的按钮被点击时,组件的 `message` 数据会被更新,从而实现了组件修改组件数据的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值