uniapp 五种组件/页面间传递数据方式总结

下面以MyUserModel类的对象进行数据传输,类定义如下

export interface IUserModel {
    name: string,
    age: number
}

export class MyUserModel implements IUserModel {
    name: '';
    age: 0;
}

第一种:props (父传子)

适用于传递对象是组件

<!-- 子组件 -->
<template>
	<view>
		<uni-easyinput v-model="userData.name" placeholder="请输入姓名"></uni-easyinput>
		<uni-easyinput v-model="userData.age" placeholder="请输入年龄"></uni-easyinput>
		<button @click="save" type="primary" style="margin-top: 20px;">确定</button>
	</view>
</template>

<script lang="ts">
import { MyUserModel } from '../../api/user';
	export default {
		name:"test_a",
		data() {
			return {
			};
		},
		props: {
			userData: {
				type: MyUserModel,
				require: false
			}
		},
		methods: {
			save() {
				console.log(this.userData)
			}
		}
	}
</script>
<!-- 父组件 -->
<template>
	<view class="container">
		<test_a :user-data="userData"></test_a>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				userData: {
					name: 'zhangsan',
					age: 18
				}
			}
		}
	}
</script>

<style>
	.container {
		padding: 20px;
		font-size: 14px;
		line-height: 24px;
	}
</style>

第二种:通过url跳转携带(父传子)

适用于传递对象是要跳转的页面

<!-- 跳转页面 -->
<template>
	<view>
		<uni-easyinput v-model="userData.name" placeholder="请输入姓名"></uni-easyinput>
		<uni-easyinput v-model="userData.age" placeholder="请输入年龄"></uni-easyinput>
		<button @click="save" type="primary" style="margin-top: 20px;">确定</button>
	</view>
</template>

<script lang="ts">
import { MyUserModel } from '../../api/user';
	export default {
		data() {
			return {
				userData: {type: MyUserModel, default: {}}
			};
		},
		onLoad(options) {
			let data = JSON.parse(decodeURIComponent(options.userData))
			Object.assign(this.userData, data)
			console.log('onload: ', this.userData)
		},
        methods: {
			save() {
				console.log(this.userData)
			}
		}
	}
</script>
<!-- 父页面 -->
<template>
	<view class="container">
		<!-- <test_a :user-data="userData"></test_a> -->
		<button @click="changePage">跳转</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				userData: {
					name: 'zhangsan',
					age: 18
				}
			}
		},
		methods: {
			changePage() {
				uni.navigateTo({
					url: '/pages/page_a/page_a?userData=' + encodeURIComponent(JSON.stringify(this.userData))
				})
			}
		}
	}
</script>

第三种:refs访问(子传父)

适用于子组件

相比于第一种方法子组件不变,父组件调整

<!-- 子组件 -->
<template>
	<view>
		<uni-easyinput v-model="userData.name" placeholder="请输入姓名"></uni-easyinput>
		<uni-easyinput v-model="userData.age" placeholder="请输入年龄"></uni-easyinput>
		<button @click="save" type="primary" style="margin-top: 20px;">确定</button>
	</view>
</template>

<script lang="ts">
import { MyUserModel } from '../../api/user';
	export default {
		name:"test_a",
		data() {
			return {
				userForm: this.userData
			};
		},
		props: {
			userData: {
				type: MyUserModel,
				require: false
			}
		},
		methods: {
			save() {
				console.log(this.userData)
			}
		}
	}
</script>
<!-- 父页面 -->
<template>
	<view class="container">
		<test_a ref="childRef" :user-data="userData"></test_a>
		<button @click="submit">提交</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				userData: {
					name: 'zhangsan',
					age: 18
				},
				childData: {}
			}
		},
		methods: {
			submit() {
				// 访问子组件属性并拷贝
				Object.assign(this.childData, this.$refs.childRef.userForm)
				console.log('submit: ', this.childData)
			}
		}
	}
</script>

第四种:$emit触发事件(子传父)

组件使用更方便,如果是uni.navigateTo跳转,需要找到合适的位置监听

<!-- 跳转页面 -->
<template>
	<view>
		<uni-easyinput v-model="userData.name" placeholder="请输入姓名"></uni-easyinput>
		<uni-easyinput v-model="userData.age" placeholder="请输入年龄"></uni-easyinput>
		<button @click="save" type="primary" style="margin-top: 20px;">确定</button>
	</view>
</template>

<script lang="ts">
import { MyUserModel } from '../../api/user';
	export default {
		data() {
			return {
				userData: {type: MyUserModel, default: {}}
			};
		},
		methods: {
			save() {
				console.log(this.userData)
				// 给父组件传值
				this.$emit('save', this.userData)
			}
		}
	}
</script>
<!-- 父页面 -->
<template>
	<view class="container">
		<page_a @save= 'getUserData'></page_a>
	</view>
</template>

<script lang="ts">
import page_a from '../page_a/page_a.vue'

	export default {
		components: {
			page_a
		},
		data() {
			return {
				childData: {}
			}
		},
		methods: {
			getUserData(childUserData) {
				console.log('getUserData: ', childUserData);
				this.childData = childUserData
			}
		}
	}
</script>

第五种:$on接收数据(兄弟传递)

注意:此处的发送信号和接收,是用的 uni.$emit 和 uni.$on

<!-- 页面 page_a.vue -->
<template>
	<view>
		<uni-easyinput v-model="userData.name" placeholder="请输入姓名"></uni-easyinput>
		<uni-easyinput v-model="userData.age" placeholder="请输入年龄"></uni-easyinput>
		<button @click="save" type="primary" style="margin-top: 20px;">确定</button>
	</view>
</template>

<script lang="ts">
import { MyUserModel } from '../../api/user';
	export default {
		data() {
			return {
				userData: {type: MyUserModel, default: {}}
			};
		},
		methods: {
			save() {
				console.log(this.userData)
				uni.$emit('save', this.userData)
			}
		}
	}
</script>
<!-- 页面paga_b.vue -->
<template>
	<view>
		
	</view>
</template>

<script lang="ts">
	export default {
		data() {
			return {
				b_userData: {}
			};
		},
		created() {
			uni.$on('save', userData => {
				console.log('b_userData: ', userData)
				this.b_userData = userData
			})
		}
	}
</script>
<!-- 父页面 -->
<template>
	<view class="container">
		<page_a></page_a>
		<page_b></page_b>
	</view>
</template>

<script lang="ts">
import page_a from '../page_a/page_a.vue'
import page_b from '../page_b/page_b.vue';

	export default {
		components: {
			page_a,
			page_b
		},
		data() {
			return {
			}
		}
	}
</script>

UniApp 是一种基于 TypeScript 的跨平台应用开发框架,它允许开发者构建一套代码可以在微信小程序、H5、Web、以及更多平台运行的应用。在 UniApp 中,`$: ComponentInternalInstance` 是组件实例对象的一个别名,它包含了组件的所有属性和方法。 当你在组件的 `data` 对象中声明变量时,如 `$data: {};`,这是初始化的数据状态,你可以在这里定义组件开始时的默认数据。`$data` 可以包含各种键值对,例如组件的状态信息、配置项等。当需要从外部传递数据组件时,通常会通过 props 属性来完成,这可以理解为父组件向子组件的传值。 举个例子: ```typescript <template> <view>{{message}}</view> </template> <script setup> import { ref } from 'uni-app'; export default { data() { return { message: ref('Hello from parent'), }; }, onReceiveMessage(value) { this.message.value = value; }, }; </script> <style scoped></style> <!--组件 --> <my-component :receiveMessage="updateMessage"></my-component> <script setup in="parentComponent.vue"> function updateMessage(newMessage) { this.$emit('receiveMessage', newMessage); } </script> ``` 在这个例子中,`$: ComponentInternalInstance` 实际上就是当前组件的实例,`$data.message` 被用于接收和展示来自父组件的更新消息。当父组件调用 `updateMessage` 并传入新值时,`onReceiveMessage` 方法会被触发,从而更新组件内部的 `message` 数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值