vue使用笔记——父子、兄弟组件之间的传值,以及$emit的奇怪用法

vue使用笔记——父子、兄弟组件之间的传值

1、父组件向子组件传值

通过props属性进行传值

<div id="emit-example-simple">
  <welcome-button btnname="Click me to be welcomed"></welcome-button>
</div>
	// 1.父组件通过自定义属性向子组件传值。子组件通过props接收对应属性。
	Vue.component('welcome-button', {
	  props:[
		  'btnname'
	  ],
	  template: `
	    <button v-on:click="$emit('welcome')">
	      {{btnname}}
	    </button>
	  `
	})
	new Vue({
	  el: '#emit-example-simple',
	  methods: {
	    sayHi: function () {
	      alert('Hi!')
	    }
	  }
	})

2、子组件向父组件传值

子组件向父组件使用$emit自定义事件传值

<div id="emit-example-simple">
  <welcome-button v-on:welcome="sayHi"></welcome-button>
</div>
	// 2.子组件触发一个事件的同时,返回一个自定义事件,父组件通过自定义组件名进行调用
	// 创建一个组件备调用,发现组件要在vue实例之前创建,不然不奏效
	Vue.component('welcome-button', {
	  template: `
	    <button v-on:click="$emit('welcome')">
	      Click me to be welcomed
	    </button>
	  `
	})
	new Vue({
	  el: '#emit-example-simple',
	  methods: {
	    sayHi: function () {
	      alert('Hi!')
	    }
	  }
	})

3、兄弟组件之间传值

兄弟组件之间可以通过bus总线进行传值。

3.1、Bus使用方案一let Bus = new Vue();创建一个Bus实例

    <div id="app">
		<b1></b1><br/>
		<b2></b2><br/>
	</div>
	 //Bus使用方案一
	let Bus = new Vue();
	
    Vue.component('b1', {
	  created:function(){
		  Bus.$on("brother2",(value) => {
			  console.log('bus1',value)
		  })
	  },
	  methods: {
		  bus1(){
			  Bus.$emit('brother1','from b1')
		  }
	  },
         template: `
           <button @click="bus1">
             component1
           </button>
         `
       })
	
    Vue.component('b2', {
	  created:function(){
		  Bus.$on("brother1",(value) => {
			  console.log('bus2',value)
		  })
	  },
	  methods: {
		  bus2(){
			  Bus.$emit('brother2','from b2')
		  }
	  },
      template: `
        <button @click="bus2">
          component2
        </button>
      `
    })
		
	// 创建vue实例调用组件
	const app = new Vue({
		el:'#app',
	})

bus总线进行传值测试截图

3.2、Bus使用方案二,在根组件的data引入Bus,然后,子组件用this. r o o t . B u s . root.Bus. root.Bus.emit/$on调用

        Vue.component('b1', {
		  created:function(){
			  this.$root.Bus.$on("root2",(value) => {
				  console.log('bus root1',value)
			  })
		  },
		  methods: {
			  bus1(){
				  this.$root.Bus.$emit('root1','from b1 root!')
			  }
		  },
          template: `
            <button @click="bus1">
              component1
            </button>
          `
        })
		
        Vue.component('b2', {
		  created:function(){
			  this.$root.Bus.$on("root1",(value) => {
				  console.log('bus root2',value)
			  })
		  },
		  methods: {
			  bus2(){
				  this.$root.Bus.$emit('root2','from b2 root!')
			  }
		  },
          template: `
            <button @click="bus2">
              component2
            </button>
          `
        })

	// 创建vue实例调用组件
	const app = new Vue({
		el:'#app',
		data(){
			return{
				//Bus使用方案二,子组件用this.$root.Bus.$emit/$on调用
				Bus
			}
		},
	})

4、使用$emit奇怪用法

看官方文档$emit在绑定中使用的时候就返回一个自定义事件名,就在想能不能同时返回点别的。然后,就瞎搞了以下代码试了试。

		Vue.component('welcome-button', {
		  props:[
			  'btnname'
		  ],
		  data: function () {
			return {
			  possibleAdvice: ['Yes', 'No', 'Maybe']
			}
		  },
		  methods: {
			giveAdvice: function () {
			  var randomAdviceIndex = Math.floor(Math.random() * this.possibleAdvice.length)
			  this.$emit('give-advice', this.possibleAdvice[randomAdviceIndex])
			}
		  },
          template: `
            <button @click="$emit('welcome',giveAdvice)">
              {{btnname}}
            </button>
          `
        })
		
		// 创建vue实例调用组件
		const app = new Vue({
			el:'#app',
			data(){
				return{
					//Bus使用方案二,子组件用this.$root.Bus.$emit/$on调用
					Bus
				}
			},
			methods:{
				welcome(e){
					console.log(e)
					e()
					alert('welcom alert')
				},
				showAdvice: function (advice) {
				  alert(advice)
				}
			}
		})

大家一起进步,文章有啥疑问可以问,尽量回答。若发现什么问题也麻烦大牛们指出,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,可以通过使用$emit和$on方法来实现父子组件之间的数据传输。通过$emit方法,子组件可以将数据发送给父组件,而通过$on方法,父组件可以监听并接收子组件发送的数据。 具体来说,子组件可以在需要传递数据的地方使用$emit方法,并在方法中指定一个自定义事件名称和要传递的数据。例如,在子组件中可以使用以下代码实现传递数据给父组件: ``` <button @click="btn">点击</button> methods: { btn() { this.$emit('father', 10) } } ``` 在上述代码中,子组件中的按钮点击事件会调用btn方法,并在方法中通过this.$emit('father', 10)来触发一个名为'father'的自定义事件,并传递数值10给父组件。 而在父组件中,可以通过在子组件元素上使用@father来监听该自定义事件,并在父组件的方法中接收传递的数据。例如,在父组件中可以使用以下代码来接收子组件传递的数据: ``` <child @father="add"></child> methods: { add(e) { console.log(e) } } ``` 在上述代码中,父组件通过监听子组件上的'father'自定义事件,并在add方法中接收传递的数据。在此例中,子组件通过this.$emit('father', 10)传递的数据10会在父组件的add方法中打印出来。 因此,通过使用$emit和$on方法,可以在Vue中实现父子组件之间的数据传输。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue中的$emit 与$on父子组件兄弟组件之间通信方式](https://download.csdn.net/download/weixin_38590989/12759856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue父子组件传值](https://blog.csdn.net/dtbk123/article/details/105643047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Vue组件向父组件传值(this.$emit()方法)](https://blog.csdn.net/weixin_42246997/article/details/104524727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值