Vue-非父子组件间的传值

非父子组件间的传值

参考官方文档:https://cn.vuejs.org/v2/guide/migration.html#dispatch-%E5%92%8C-broadcast-%E6%9B%BF%E6%8D%A2
在开发中,常常需要在非父子组件中传值,有如下两种方案

使用总线方式

使用方式

  1. 在Vue原型中新建一个总线:
// 通过实例化一个空的 Vue 实例来实现总线
Vue.prototype.$bus=new Vue()

$ 是在 Vue 所有实例中都可用的属性的一个简单约定。这样做会避免和已被定义的数据、方法、计算属性产生冲突。
prototype 的作用可以看成是一个作用域,具体的使用方法和注意事项,参考官方文档:https://cn.vuejs.org/v2/cookbook/adding-instance-properties.html
2. 自定义组件:

//创建组件
Vue.component('my-lable',{
	data(){
		return {
			msg:this.content
		}
	},
	props:{
		// 校验类型
		content:String
	},
	template:'<div @click="handleDeliveryValue">{{msg}}</div>',
	methods:{
		handleDeliveryValue(){
			// 触发总线的$on 事件,必须和 $on 在一个实例上,所以使用 $bus
			this.$bus.$emit('handler-change-value',this.msg)
		}
	},
	// 挂载后开始监听
	mounted(){
		// 通过$emit事件触发
		this.$bus.$on('handler-change-value',function(content){
			// TODO
		})
	},
	// 最好在组件销毁前,清除事件监听
	destroyed() {
		this.$bus.$off('handler-change-value',this.handleDeliveryValue)
	}
})

完整代码

<body>
		<div id="app">
			<my-lable content='one'></my-lable>
			<my-lable content='two'></my-lable>
		</div>
	</body>
	<script>
		// 通过实例化一个空的 Vue 实例来实现总线
		Vue.prototype.$bus=new Vue()
		//创建组件
		Vue.component('my-lable',{
			data(){
				return {
					msg:this.content
				}
			},
			props:{
				// 校验类型
				content:String
			},
			template:'<div @click="handleDeliveryValue">{{msg}}</div>',
			methods:{
				handleDeliveryValue(){
					// 触发总线的$on 事件
					this.$bus.$emit('handler-change-value',this.msg)
				}
			},
			// 挂载后开始监听
			mounted(){
				var _this=this
				// 通过$emit事件触发
				this.$bus.$on('handler-change-value',function(content){
					// 更改msg的值
					_this.msg=content
				})
			},
			// 最好在组件销毁前,清除事件监听
			destroyed() {
				this.$bus.$off('handler-change-value',this.handleDeliveryValue)
			}
		})
		new Vue({
			el:'#app'
		})
	</script>

使用vuex方式

参考:https://vuex.vuejs.org/zh/

  1. 新建一个 index.js 文件,负责管理vuex
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

// 导出vuex创建的仓库
export default new Vuex.Store({
  state: {
    city: '北京' // 存储一个默认值
  },
  actions: {
    changeCity (ctx, city) {
      ctx.commit('changeCity', city) //调用mutations的changeCity 方法修改值
    }
  },
  mutations: {
    changeCity (state, city) { // 修改city的值
      state.city = city
    }
  }
})

  1. 通过{{this.$store.state.city}} 插值表达式方式在其他页面获取city的值。
  2. 使用 this.$store.dispatch('changeCity', '天津') 修改值,其他页面的city值会显示最新的值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值