子组件中修改props值 (setup + ts + vue3) | emit(‘update:value‘,value) 使用方法

文章讲述了在Vue中,父子组件之间的prop数据传递是单向下行绑定的,子组件不应直接修改prop值。为了解决这个问题,文中提供了示例,展示如何在子组件中通过`v-model`和`emit`来更新父组件的状态,以及如何使用`watch`监听prop的变化。
摘要由CSDN通过智能技术生成

父子 prop 之间存在一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。因此子组件中不可以修改prop值,否则会报错,导致程序无法运行

小程序中控制台提醒如下:

 当前修改的key为只读属性

解决方法:

父组件:

<CheckAlone v-model:isCheck="isCheck"></CheckAlone>

<script lang="ts" setup>
	import { ref } from 'vue'
	const isCheck = ref(false)
</script>

注意:一定要加 v-model

注意:一定要加 v-model

注意:一定要加 v-model

子组件:

<template>
	<view class="check-alone" @click="onCheckChange">
         <!--这边绑定的是自己重新定义的isCheck-->
		<image class="check-icon" v-if="isCheck" src="./check.png" mode=""></image>
		<view class="check-circle" v-else></view>
	</view>
</template>

<script lang="ts" setup>
	import { ref ,Ref,watch} from 'vue'

    //定义emit
	const emit = defineEmits(['update:isCheck'])

    //定义prop
	type Props = {
		isCheck:boolean,
		size:number | string
	}
	const props = withDefaults(defineProps<Props>(),{
		isCheck:false,
		size:34
	})

    //重新定义一个值来接受prop
	const isCheck:Ref<boolean> = ref(false)

    //因为prop中的值非动态响应,所以需要通过watch监听,immediate 初始化时接收父组件中的传值
	watch(() => props.isCheck,() => {
		isCheck.value = props.isCheck;
	},{
		immediate:true
	})

    //点击事件触发时更新父组件的值
	const onCheckChange = () => {
		emit('update:isCheck',!isCheck.value)
	}
	
</script>

因为我怕命名混乱,所以父组件子组件中都使用的同一个命名 isCheck

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 + TypeScript,要实现父组件触发组件的弹窗组件显示隐藏,可以通过以下步骤来实现: 1. 在父组件使用`ref`创建一个响应式变量来控制组件的显示与隐藏状态。 ```typescript import { ref } from 'vue'; export default { setup() { const isModalVisible = ref(false); const openModal = () => { isModalVisible.value = true; }; const closeModal = () => { isModalVisible.value = false; }; return { isModalVisible, openModal, closeModal }; } }; ``` 2. 在父组件的模板使用`v-model`绑定组件的显示与隐藏状态。 ```html <template> <div> <button @click="openModal">Open Modal</button> <child-component v-model="isModalVisible"></child-component> </div> </template> ``` 3. 在组件,接收父组件传递的显示与隐藏状态,并根据该状态来控制弹窗的显示与隐藏。 ```typescript import { defineComponent, ref, watch } from 'vue'; export default defineComponent({ props: { modelValue: { type: Boolean, required: true } }, emits: ['update:modelValue'], setup(props, { emit }) { const isModalVisible = ref(props.modelValue); watch( () => props.modelValue, (newValue) => { isModalVisible.value = newValue; } ); const closeModal = () => { isModalVisible.value = false; emit('update:modelValue', false); }; return { isModalVisible, closeModal }; } }); ``` 4. 在组件的模板,根据`isModalVisible`变量来控制弹窗的显示与隐藏。 ```html <template> <div v-if="isModalVisible"> <!-- 弹窗内容 --> <button @click="closeModal">Close Modal</button> </div> </template> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值