uni-app 组件传参

  • 父向子传递参数,通过属性的方式
  • 子向父传递参数,通过触发事件的方式
  • 使用全局数据传递参数
    • 通过挂载vue的原型
    • 通过globalData的方式 (兄弟/非兄弟之间都可以使用)

父向子 传递

- 父页面向子组件ul-com通过属性名list传递了数组数据
- 子组件通过props接收数据

<ul-com :list="[1,2,3,4]">

props: {
	list: Array
}
# img-border.vue
<template>
	<!-- 将props中的mysrc看成是data中的变量来使用-->
	<img class="img-border" :src="mysrc"/>
</template>

<script>
	export default {
		// 声明父组件传递过来的属性
		props: {
			mysrc: String
		}
	}
</script>

<style>
	.img-border {
		border-radius: 50%;
	}
</style>

# index.vue(父组件) 引入组件img-border.vue(子组件)

<template>
	<view class="content">
		<img-border :mysrc="src1"/> // mysrc作为属性名传递给子组件(与子组件中的属性保持一致)
		<img-border :mysrc="src2"/>
	</view>
</template>

<script>
	import imgBorder from "@/components/img-border";
	export default {
		data() {
			return {
				src1: "src1.png";
				src2: "src2.png";
			}
		},
		components: {
			imgBorder: imgBorder
		}
	}
</script>

子向父 传递

子组件向父组件传递数据

  • 子组件通过触发事件的方式向父组件传递数据
  • 父组件通过监听事件的方式来接收数据
methods: {
	handleClick() {
		this.$emit("textChange", "from Child Component"); // this.$emit 是固定写法格式
	}
}

<ul-com :list="[1,2,3,4]"> @textChange="handleClick"/>
# img-border.vue
<template>
	<!-- 将props中的mysrc看成是data中的变量来使用-->
	<img @click="handleClick" class="img-border" :src="mysrc"/> #第一步
</template>

<script>
	export default {
		methods: {
			handleClick() {
				console.log("hello img-border.vue");
				
				// 子向父传递数据,通过触发事件
				// this.$emit("自定义的事件名称", "要传递的参数");
				this.$emit("mysrcChange", this.mysrc); #第二步
			}
		}
	}
</script>

<style>
	.img-border {
		border-radius: 50%;
	}
</style>

--------------------
# index.vue(父组件) 引入组件img-border.vue(子组件)

<template>
	<view class="content">
		<img-border @mysrcChange="handleSrcChange" :mysrc="src1"/> // mysrc作为属性名传递给子组件(与子组件中的属性保持一致)#第三步
	</view>
</template>

<script>
	import imgBorder from "@/components/img-border";
	export default {
		data() {
			return {
				mysrc: "",
				src1: "src1.png";
			}
		},
		components: {
			imgBorder: imgBorder
		},
		methods: {
			handleSrcChange(e) { #第四步
				console.log("父组件的自定义事件被触发");
				
				console.log(e);
				this.mysrc = e;
			}
		}
	}
</script>

主要由四步组成,如以上代码块所示。

全局共享数据

  • 通过vue的原型共享数据 (较为常用)
  • 通过globalData共享数据 (较为常用)
  • vuex (了解即可)
  • 本地存储(了解即可)

为何需要使用全局共享数据?
- 有些组件之间不是父子关系,而是中间隔了很多层关系。组件之间共享数据无法通过父子传参,需要使用全局共享数据实现。

Vue.prototype.baseurl = "http://www.baidu.com"

getApp().globalData.text = 'test'

main.js 中定义vue的原型

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

// 定义全局数据,通过Vue的原型实现
Vue.prototype.baseurl = "http://www.baidu.com"; // Vue.prototype定义的变量均可通过this调用


App.mpTyp = 'app'

const app = new Vue({
	...App
})
app.$mount()

App.vue中定义globalData

<script>
	export default {
		onLaunch: function() {
			console.log('App launch');
		},
		onShow: function() {
			console.log('App show');
		},
		onHide: function() {
			console.log('App hide');
		},
		globalData: {
			base: "www.360.com"
		}	
	}
</script>

index.vue中使用Vue定义的原型变量

<template>
  ...
</template>

<script>
	export default {
		data() {
			...
		},
		components: {
			...
		},
		methods: {
			...
		},

		// onLoad 页面加载完毕就会触发的生命周期函数
		onLoad() {
			console.log(this.baseurl); // 来自main.js
			
			// 获取globalData数据
			// 固定写法,表示获取当前小程序的所有实例 getApp()
			console.log(getApp().globalData.base); //任意页面均可调用 (可读)
			getApp().globalData.base = "1234"; //任意页面均可调用 (可写)
		}
	}
</script>

组件插槽

- 标签也是一种数据,利用插槽slot可实现动态为父组件向子组件传递标签
- 通过slot实现占位符

src\components
|_ my-form.vue (子组件)

<template>
    <view class="form">
        <view class="form_title">title</view>
        <view class="form_content">
            <slot></slot> <!-- 第二步: 定义slot-->
        </view>
    </view>
</template>

<script>
    ...
</script>

<style>
    ...
</style>

index.vue 将标签传递给子组件my-form.vue

<template>
    <view class="content">
        <my-form>
            <view>
                <!--第一步:定义标签-->
                <input type="text">
                <radio/>
                <checkbox />
            </view>
        </my-form>
    </view>
</template>

<script>
import myForm from "@/components/my-form";
export default {
    components: {
        myForm
    }
}
</script>

<style>
    ...
</style>

猜你喜欢

转载自blog.csdn.net/A_bad_horse/article/details/113666610