组件通信 小程序

组件通信:

父传子:

父组件。只需要 在子组件标签上 绑定一个变量把要发送的数据赋给它

<template>
	<view class="content">
		<view class="text-area">
			<Zua :value="msga"></Zua>
		</view>
	</view>
</template>

<script>
	import Zua from "../../components/zua/zua.vue"
	export default {
		data() {
			return {
				msga: 'Helloo'
			}
		},
		components:{
			Zua
		},
		methods: {

		}
	}
</script>

子组件。使用props接受 父组件定义的变量名(建议使用完整写法)

<template>
	<view class="">
		{{value}}
	</view>
</template>

<script>
	export default{
		props:{
			value:{
				type:String,
				default:'Hello'
			}
		},
		data(){
			return{
				
			}
		}
	}
</script>

子传父

父组件。需要在子组件标签上 @自定义事件=“父组件的事件”(注意这里的自定义事件是在子组件里定义的)

<template>
	<view class="content">
		<view class="text-area">
			<Zua @receive="receiveF"></Zua>
			{{msgb}}
		</view>
	</view>
</template>

<script>
	import Zua from "../../components/zua/zua.vue"
	export default {
		data() {
			return {
				msgb:''
			}
		},
		components:{
			Zua
		},
		methods: {
			receiveF(e){
				this.msgb=e;
				console.log(e);
			}
		}
	}
</script>

子组件。需要通过事件 然后在事件里写this.$emit(“自定义事件”,要传的值)

<template>
	<view class="">
		<button @click="send">点击子组件传父组件</button>
	</view>
</template>

<script>
	export default{
		data(){
			return{
				message:'我是子组件的数据'
			}
		},
		methods:{
			send(){
				this.$emit("receive",this.message)
			}
		}
	}
</script>

组件与组件(这里是a发给b数据)

父组件。也就是说组件与组件通信 需要父组件中介,a发给父组件($emit),父组件传给b(props)。

<template>
	<view class="content">
		<view class="text-area">
			<Zua @receive="receiveF"></Zua>
			{{msgb}}
			<Zub :zub="msgb"></Zub>
		</view>
	</view>
</template>

<script>
	import Zua from "../../components/zua/zua.vue"
	import Zub from "../../components/zub/zub.vue"
	export default {
		data() {
			return {
				msgb:''
			}
		},
		components:{
			Zua,
			Zub
		},
		methods: {
			receiveF(e){
				this.msgb=e;
				console.log(e);
			}
		}
	}
</script>

a组件。

<template>
	<view class="">
		<button @click="send">点击子组件传父组件</button>
	</view>
</template>

<script>
	export default{
		data(){
			return{
				message:'我是子组件a的数据'
			}
		},
		methods:{
			send(){
				this.$emit("receive",this.message)
			}
		}
	}
</script>

b组件。

<template>
	<view class="" style="border: 1px solid red;">
		{{zub}}
	</view>
</template>

<script>
	export default{
		props:{
			zub:{
				type:String,
				default:''
			}
		},
		data(){
			return{
				
			}
		}
	}
</script>

v-model实现组件通信

父组件。

<template>
	<view class="content">
		<view class="vzu">
			<Vzu @inputtt="inpsF" />
			{{inpt}}
		</view>
	</view>
</template>

<script>
	import Vzu from "../../components/vzu/vzu.vue"
	export default {
		data() {
			return {
				inpt: ''
			}
		},
		components: {
			Vzu
		},
		methods: {
			inpsF(e){
				this.inpt=e;
			}
		},
	}
</script>

子组件。

<template>
	<view class="content" style="border:1px solid red;">
		<input v-model="inp" @input="inps" class="uni-input" placeholder="输入" />
	</view>
</template>

<script>
	export default {
		data() {
			return {
				inp: ''
			}
		},
		methods: {
			inps() {
				this.$emit("inputtt", this.inp);
			}
		}
	}
</script>

子组件通过v-model和@input实现数据实时更新,把这个更新的数据发送给父组件,所以父组件显示的也是更新着的数据。

<think>嗯,用户想了解小程序组件通信。首先,我需要回忆一下小程序开发中组件通信的几种方式。记得小程序主要有父组件向子组件、子组件向父组件、兄弟组件之间的通信,还有全局数据管理,比如使用app.js里的globalData或者状态管理工具。可能还需要提到事件触发机制,比如triggerEvent。 接下来,要分步骤解释每种通信方式。首先,父到子是通过属性传递,也就是properties。需要举例子,比如父组件在子组件标签上绑定属性,子组件在properties里接收。然后,子到父是通过事件,子组件用this.triggerEvent发送事件,父组件在子组件标签上绑定事件处理函数。 兄弟组件之间的通信可能比较复杂,通常需要借助共同的父组件或者全局数据。比如,一个子组件发送事件给父组件,父组件再传递给另一个子组件。或者使用getApp().globalData来共享数据,但要注意及时更新。 全局事件总线可能在小程序里需要自己实现,或者使用第三方库,比如pubsub-js。不过小程序本身没有内置的事件总线,可能需要用app.js里定义一个事件监听和触发的机制。 另外,还有通过selectComponent选择组件实例,直接调用方法或者修改数据,但这种方式耦合性较高,可能不太推荐,但在某些情况下可以用。 还要注意,如果是复杂应用,可能需要状态管理,比如使用mobx-miniprogram或者westore之类的库,或者小程序自带的behaviors来共享代码,但behaviors更多是代码复用,不是状态管理。 需要检查每种方式的适用场景和优缺点,比如父子通信简单直接,兄弟组件可能需要中间层,全局数据适合多个组件共享但需要手动管理更新。事件系统是解耦的好方法,但要注意事件命名冲突的问题。 可能用户是刚开始学习小程序开发,所以需要例子和代码片段,比如展示properties的使用,triggerEvent的示例,以及如何在父组件中处理事件。同时提醒一些常见错误,比如在子组件中修改properties的值应该避免,应该通过事件通知父组件修改。 还要提到页面与组件之间的通信,比如页面作为父组件组件之间的通信,或者组件与页面之间的交互,可能和普通组件通信类似,但可能有页面生命周期的影响。 总结的时候要结构清晰,分点列出每种通信方式,说明如何实现,适用场景,可能的问题,以及推荐的实践。确保用户能够根据不同的情况选择合适的通信方式,并理解其原理。</think>小程序组件通信主要有以下几种方式,下面分步骤详细说明: 1️⃣ 父组件向子组件传值 • 实现方式:通过`properties`属性传递 • 步骤: ① 父组件在子组件标签添加自定义属性 ```wxml <child-component myProp="{{parentData}}"></child-component> ``` ② 子组件在`properties`中声明接收 ```js Component({ properties: { myProp: { type: String, // 类型校验 value: '' // 默认值 } } }) ``` 2️⃣ 子组件向父组件传值 • 实现方式:通过自定义事件触发 • 步骤: ① 子组件使用`triggerEvent`发送事件 ```js this.triggerEvent('myevent', { value: data }) ``` ② 父组件监听事件 ```wxml <child-component bind:myevent="handleEvent"></child-component> ``` ③ 父组件处理事件 ```js Page({ handleEvent(e) { console.log(e.detail.value) } }) ``` 3️⃣ 兄弟组件通信 • 实现方式:通过共同父组件中转 • 流程: 子组件A → 父组件 → 子组件B 使用组合式组件设计,通过父级进行数据中转 4️⃣ 全局数据通信 • 方式一:使用全局`app.js` ```js // app.js App({ globalData: { sharedData: '全局数据' } }) // 组件中获取 const app = getApp() console.log(app.globalData.sharedData) ``` • 方式二:使用状态管理库 如使用`mobx-miniprogram`等第三方库实现响应式数据管理 5️⃣ 组件间直接访问 • 通过`selectComponent`选择器(慎用) ```js // 父组件中 this.selectComponent('#child-id').methodName() ``` 🌟 最佳实践建议: 1. 优先使用`properties+events`的父子通信 2. 复杂场景建议使用状态管理工具 3. 避免滥用全局数据,防止数据污染 4. 跨多层级组件通信可使用`eventBus`模式 💡 注意事项: • 数据流向应保持单向性 • 避免在子组件直接修改父组件数据 • 大型项目推荐使用`Vuex`模式的状态管理方案 • 事件命名建议使用`kebab-case`格式 通过合理组合这些通信方式,可以构建出高内聚、低耦合的小程序组件架构。具体实现时需要根据业务场景选择最适合的通信方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值