uni-app父子组件传递数据

新建项目

在这里插入图片描述

新建组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tails3PN-1647575137668)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220318091121756.png)]

<template>
	<view>
		edit
	</view>
</template>

<script>
	export default {
		
	}
</script>

<style scoped lang="less">

</style>

组件里面没啥内容,就一个纯粹的模板。

在index.vue中引入并注册组件,

<script>
	import user-info-edit from '../../components/user-info/user-info-edit';
	import user-info-show from '../../components/user-info/user-info-show';
	
	export default {
		
		components:{
			user-info-edit,user-info-show
		}
	}
</script>

在代码中使用组件,如下

<template>
	<view>
		<user-info-edit></user-info-edit>
		<user-info-show></user-info-show>
	</view>
</template>

OK ,现在启动,运行到浏览器。

会发现报如下的语法错误,而(9:11)就是import 这个单词后面,其实是无法使用 “-” 横线作为连接符。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKi1q7HO-1647575137671)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220318091418337.png)]

将注册的组件修改为如下名字就可,驼峰的写法,在vue的界面中就可以使用 这种标签。

import userInfoEdit from '../../components/user-info/user-info-edit';
import userInfoShow from '../../components/user-info/user-info-show';
	
	export default {
		
		components:{
			userInfoEdit,userInfoShow
		}
	}

OK,组件显示成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65658Wr9-1647575137672)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220318091710270.png)]

传递数据给子组件

​ 传递数据给子组件,只需要在子组件中增加属性即可。

在 user-info-show.vue中增加属性,定义一个userInfos的数组,用来展示数据。

export default {
		props:{
			userInfos:Array
		}
	}

在子组件页面中就可以使用一个ulist来循环展示,如下

<!--用户信息列表-->
		<uni-list>
			<uni-list-item v-for="(userInfo,index) in userInfos" :key="index">
				<view slot="body">
					<uni-row>
						<uni-col :span="12">
							<text>姓名:</text>
						</uni-col>
						<uni-col :span="12">
							<text>{{userInfo.emp_name}}</text>
						</uni-col>
					</uni-row>
					<uni-row>
						<uni-col :span="12">
							<text>工号:</text>
						</uni-col>
						<uni-col :span="12">
							<text>{{userInfo.emp_code}}</text>
						</uni-col>
					</uni-row>
					<uni-row>
						<uni-col :span="12">
							<text>工牌:</text>
						</uni-col>
						<uni-col :span="12">
							<text>{{userInfo.emp_badge_mac}}</text>
						</uni-col>
					</uni-row>
					<uni-row>
						<uni-col :span="12">
							<text>绑定状态:</text>
						</uni-col>
						<uni-col :span="12">
							<text>{{userInfo.bind_status_name}}</text>
						</uni-col>
					</uni-row>
				</view>
			</uni-list-item>
		</uni-list>

在父组件中使用子组件时传递数据,调用 userInfos属性,如下所示,这个属性是 组件中定义的,等号后面的是父组件中 data的数据。

<user-info-show :userInfos="userInfos"></user-info-show>

最后页面就展示了,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYCkejze-1647575137674)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220318110415850.png)]

传递数据给父组件

如下图所示,用不同颜色标出了对应的关系,父组件注册监听,并给子组件一个回调函数,子组件触发监听,系统自动将数据传递给对调函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EV477sSF-1647575137675)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220318113043068.png)]

获取子组件中数据,然后由父组件来操作,比如子组件展示了数据后需要弹框让用户修改用户数据。

​ 子组件发送数据主要是靠 $emit(eventName,param) 这个方法,如下图是官网对这个方法的解释。

也就是说,父组件要传递给监听器一个回调函数,这个函数就用来接收子组件参数。

此时在index.vue(父组件)也就是中methods处定义一个方法,也就是回调函数,如下所示

childData(param){
	console.log(param)
},

在子组件user-info-show.vue中也定义一个方法,用来触发自定义事件(userData),如下代码

methods:{
			sendData(param){
				this.$emit('userData',param);
			}
		}

在父组件index.vue中增加这个自定义事件,并把回调函数childData给他,如下代码 @userData=“childData”

<user-info-show :userInfos="userInfos" @userData="childData"></user-info-show>

此时childData中就能接收到子组件的数据。

综上总结一下写法就是如下,

父组件:
<user-info-show @userData="childData"></user-info-show>
export default {
    methods:{
        childData(param){
        }
    }
}
子组件:
<view  @click="sendData(userInfo)"></view>
export default {
    methods:{
        sendData(param){
        	this.$emit('userData',param);
        }
    }
}

问题项

跨域

uni.request({
					url: 'http://192.168.3.92:8088/api/userinfo/findUsers',
					method: 'GET',
					data: {},
					dataType:"json",
					success: res => {
						this.userInfos = res.data.data;
						console.log(res)
					},
					fail: () => {},
					complete: () => {}
				});

如上所示,在浏览器请求 http://192.168.3.92:8088/api/userinfo/findUsers 这个地址时存在跨域问题。

此时在manifest.json中增加H5跨域方面的配置,如下所示,

"h5": {
		"devServer": {
			"proxy": {
				"/root/": {   //匹配的头部
					"target": "http://192.168.3.92:8088",  //目标路径
					"pathRewrite": {
						"^/root/": ""  //需要将  /root/  这个单词替换为空
					}
				}
			}
		}
	}

这样上述请求就可以写为 /root/api/userinfo/findUsers,

如果不加 ^/root/ 的话,最终替换会变为 /root/http://192.168.3.92:8088/api/userinfo/findUsers, 所以需要将 /root/ 替换为空字符串。
这样上述请求就可以写为 /root/api/userinfo/findUsers,

如果不加 ^/root/ 的话,最终替换会变为 /root/http://192.168.3.92:8088/api/userinfo/findUsers, 所以需要将 /root/ 替换为空字符串。

PS: 修改配置后需要重启工程,否则新配置不会生效。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值