props+emit实现父子组件传参,子组件接参的四种情况

definedModel

适用于vue3.4及单文件组件中

toRef

{
	props:["msg"],                 
	setup(props,{emit}) {
		let msg1 = toRef(props,"msg")
		// let msg1 = computed(()=>props.msg.toUpperCase())
        //let msg1 = ref(props.msg)//使用错误
		//toRef(props,"msg")!==ref(props.msg)(失去响应性)

					
		const handlerClick = function(){
			emit("update:msg","子组件更新父组件msg!")
				}

		return {
			msg1,
			handlerClick
			
			}
		}
}

data+watch

{
	props:["msg"],	            
	data(){
		return {
			msg1:this.msg
		}
	},
	watch:{
		msg(newVal,oldVal){
			this.msg1 = newVal
			
		}
	},
	methods:{
			handlerClick(){
				this.$emit("update:msg","子组件更新父组件msg!")
			}
	},
}

computed(更强调对值的额外处理)

{
	props:["msg"],                 
	methods:{
			handlerClick(){
				this.msg1 = "子组件更新父组件msg!"
				// this.$emit("update:msg","子组件更新父组件msg!")
			}
	},
	computed:{
		msg1:{
			get(){
				return this.msg.toUpperCase()
			},
			set(val){
				this.$emit("update:msg",val)
			}
		}
	},
}

完整

<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title></title>
	</head>
	<body>
		<script type="importmap">
			{
			"imports": {
			"vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js"
			}
		}
		</script>
		<div id="app">
			<h1>父组件</h1>
			<ul>
				<li>
					父组件字符串msg===={{msg}}
				</li>
			</ul>
			<div>
				<button @click="changeMsg">修改msg</button>
			</div>
			<component-a v-model:msg="msg" />
		</div>

		<template id="template-a">
			<h1>子组件</h1>
			<ul>
				<li>子组件定义的msg1===={{msg1}}</li>
				<li>父组件传过来的msg===={{msg}}</li>
			</ul>

			<div>
				<button @click="handlerClick">修改msg</button>
			</div>
		</template>
		<script type="module">
			import {
				createApp,
				ref,
				computed,
                toRef
			} from 'vue'


			//定义子组件A
			const ComponentA = {
				props: ["msg"],
				// data(){
				// 	return {
				// 		msg1:this.msg
				// 	}
				// },
				// watch:{
				// 	msg(newVal,oldVal){
				// 		this.msg1 = newVal

				// 	}
				// },
				methods: {
					handlerClick() {
						this.msg1 = "子组件更新父组件msg!"
						// this.$emit("update:msg","子组件更新父组件msg!")
					}
				},
				computed: {
					msg1: {
						get() {
							return this.msg.toUpperCase()
						},
						set(val) {
							this.$emit("update:msg", val)
						}
					}
				},
				setup(props, {
					emit
				}) {
					// let msg1 = toRef(props,"msg")
					let msg1 = computed(() => props.msg.toUpperCase())

					const handlerClick = function() {
						emit("update:msg", "子组件更新父组件msg!")
					}
					return {
						msg1,
						handlerClick

					}
				},

				template: "#template-a"
			}


			//声明父组件
			const app = createApp({
				components: {
					ComponentA,
				},
				setup() {
					let msg = ref("hello msg!")
					const changeMsg = function() {
						msg.value = "hello world"
					}

					return {
						msg,
						changeMsg,
					}
				}
			})
			app.mount('#app')
		</script>
	</body>
</html>

体验demo

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue的setup语法糖中,可以通过父组件传递参数给组件,以及通过组件派发事件传递参数给父组件。 首先,在父组件中,我们可以通过在模板中使用冒号绑定属性的方式将参数传递给组件。例如,可以使用`:userType="userType"`将`userType`参数传递给组件。 然后,在组件中,我们可以使用`defineProps`函数定义接收的参数。在`defineProps`函数中,我们可以指定参数的类型、默认值和是否必须传递。例如,`const props = defineProps({ userType: { type: String, default: String, required: true } })`定义了一个名为`userType`的参数,类型为字符串,有一个默认值为空字符串,且必须传递。 在父组件中,通过派发事件的方式可以获取组件传入的参数。例如,在父组件的方法中,可以使用`@menu-send="menuSend"`将组件通过`$emit`方法派发的事件与父组件的方法进行绑定。然后在`menuSend`方法中,可以获取组件传入的参数。 综上所述,通过父组件传递参数给组件和通过组件派发事件传递参数给父组件,可以实现父子组件之间的参数传递。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3 + vite + ts + setup , 第二练 setup ts语法糖中实现父子组件传参](https://blog.csdn.net/csl125/article/details/124262027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue3父子组件传参(setup语法糖写法)](https://blog.csdn.net/skyblue_afan/article/details/126667586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值