Vue中的父子组件传值从父组件控制子组件的显示

本文介绍了在Vue中如何通过props从父组件控制子组件的显示和关闭,避免了高耦合的实现方式。通过定义属性并使用`v-bind`和`v-on`监听事件,实现子组件的显示和隐藏状态由父组件控制。同时强调了在子组件向父组件传值时注意方法命名规范,避免大小写问题导致的监听失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在工作遇到了一个小问题,需求是在一个vm实例中创建一个组件,是一个弹框,我使用了组件来做这个弹框.在父组件中有一个按钮点击显示子组件.
当子组件显示的时候,子组件左上角有一个× 点击可以关闭他,一开始我是这么做的:

  1. 在父组件上定义一个变量,默认为false ,然后使用v-show来控制子组件的显示和隐藏
  2. 当子组件显示的时候在子组件上定义变量,默认为true,当点击 ×的时候改变这个变量为false
  3. 最后完成这个组件的显示和关闭
    **问题是这样代码的耦合性很高,父组件和子组件的判断逻辑复杂,需要同时控制两个属性,很头疼
    那么换另一个思路,在父组件上定义一个属性.用来隐藏和显示这个子组件,用props 来传值,当子组件关闭的时候吧这个属性传回给父组件,由父组件身上的隐藏显示方法去关闭这个子组件!
    上代码
 <!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父子传值</title>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<p>我是父组件</p>
			<button  @click="showson"> 点击显示子组件</button>
			<sonbox @formson="fromsonFn" v-show="ctrlloter" :center="ctrlloter"></sonbox>
			
		</div>
		<template id="sonbox">
			<div>
				<p>我是子组件</p>
				<button @click="closeSon">我是在子组件里面的按钮 点击关闭子组件</button>
			</div>
		</template>
		<script src="lib/vue.js"></script>
		<script>
			var vm =new Vue({
				el:'#app',
				components:{
					'sonbox':{
						template:'#sonbox',
						props:{
							center:Boolean
						},
						methods:{
							closeSon(){
								this.$emit('formson',false);
							}
						}
					}
				},
				data:function(){
					return{
						ctrlloter:false,
					}
				},
				methods:{
					showson(){
						this.ctrlloter=true;
					},
					fromsonFn(val){
						this.ctrlloter=val;
					}
				}
			})
		</script>
	</body>
</html>

父组件传值给子组件的步骤:
1.在父组件中定义属性ctrlloter
2.然后在使用子组件的html元素上 添加绑定属性v-bind: 简写 : 跟上子组件要在自己内部的接收的值代码是: :center="ctrlloter"
3.到子组件中创建props属性在属性中定义center,可以为空,也可以定义它的变量类型,这里我定义为boolean类型
就这样获取到父组件传过来的值
子组件传值给父组件的步骤:
1.当点击子组件内部的按钮的时候触发closeSon方法,通过$emit关键字把false这个布尔类型传给父组件
2.子组件代码中this.$emit('formson',false);formson 指的是父组件在调用子组件的html元素上,使用v-on: 进行对formson 方法进行监听
3.<sonbox @formson="fromsonFn" v-show="ctrlloter" :center="ctrlloter"></sonbox> 代码中 @formson 就是使用了v-on 的简写进行这个方法的监听而fromsonFn是在父组件中定义的方法,用来接收子组件传过来的false
4.fromsonFn(val){ this.ctrlloter=val; }这个方法在父组件中用来接收子组件传过来的值,赋值在ctrlloter上,从而做到从父组件层级关闭子组件的显示

过程中注意的问题:在子传父的过程中容易出现方法大小写问题从而v-on监听不到这个方法导致传值失败,建议使用小写和下划线的方式,在命名方法和变量的时候记得区分,新人很容易混淆

$emit方法的更多使用方式需要看其他大神代码.目前只知道这个方法使用来将子组件的值传给父组件的,继续加油吧

### Vue 3 父子组件教程 在 Vue 3 中,父子组件之间的数据递主要通过 `props` 和 `emit` 实现。组件可以通过 `props` 将数据递给子组件,而子组件则可以通过 `emit` 触发事件将数据回组件。 #### 组件子组件 组件可以使用 `props` 向子组件递数据。以下是一个完整的示例: ```vue <!-- ParentComponent.vue --> <template> <div> <h1>组件</h1> <p>当前:{{ inputValue }}</p> <ChildComponent :value="inputValue" @update:value="handleInput" /> </div> </template> <script setup> import { ref } from &#39;vue&#39;; import ChildComponent from &#39;./ChildComponent.vue&#39;; // 定义组件的数据 const inputValue = ref(&#39;初始&#39;); // 处理子组件的更新事件 const handleInput = (newValue) => { inputValue.value = newValue; }; </script> ``` 在此示例中,组件通过 `:value` 将数据递给子组件,并监听 `update:value` 事件以接收子组件的更新[^1]。 #### 子组件组件 子组件可以通过 `emit` 方法将数据发送回组件。以下是子组件的实现: ```vue <!-- ChildComponent.vue --> <template> <div> <h2>子组件</h2> <input :value="modelValue" @input="updateValue" /> </div> </template> <script setup> defineProps({ modelValue: { type: String, required: true } }); const emit = defineEmits([&#39;update:modelValue&#39;]); const updateValue = (event) => { emit(&#39;update:modelValue&#39;, event.target.value); }; </script> ``` 在这个例子中,子组件通过监听 `input` 事件来捕获用户的输入,并通过 `emit` 方法触发 `update:modelValue` 事件将新递给组件。 #### 使用 `v-model` 简化双向绑定 Vue 3 支持通过 `v-model` 实现父子组件之间的双向绑定。以下是如何结合 `v-model` 使用的示例: ```vue <!-- ParentComponent.vue --> <template> <div> <h1>组件</h1> <p>当前:{{ inputValue }}</p> <ChildComponent v-model="inputValue" /> </div> </template> <script setup> import { ref } from &#39;vue&#39;; import ChildComponent from &#39;./ChildComponent.vue&#39;; const inputValue = ref(&#39;初始&#39;); </script> ``` ```vue <!-- ChildComponent.vue --> <template> <div> <h2>子组件</h2> <input :value="modelValue" @input="updateValue" /> </div> </template> <script setup> defineProps({ modelValue: { type: String, required: true } }); const emit = defineEmits([&#39;update:modelValue&#39;]); const updateValue = (event) => { emit(&#39;update:modelValue&#39;, event.target.value); }; </script> ``` 通过 `v-model`,组件子组件之间的数据绑定变得更加简洁和直观。 #### 注意事项 - 组件子组件递数据时,确保 `props` 的类型与数据一致。 - 子组件组件递数据时,推荐使用标准化的事件名称(如 `update:modelValue`),以便代码更具可读性[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值