子组件向父组件传参的几种方法

这篇具有很好参考价值的文章主要介绍了子组件向父组件传参的几种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

子组件向父组件传参的几种方法

在用vue框架写项目的时候,多多少少会遇到子组件向父组件传参的方法。作为一个新手,确实让人头疼,于是便有了这篇小白写的总结,话不多说,开始!

以下方法全部基于这两个父子组件结构实现:

  • 父组件
<template>
  <div class="parent">
    <div>我是父组件</div>
    <div>我收到的消息为:<span class="msg">{{msgP}}</span></div>
    <div>仓库里的msg: <span class="msg">{{this.$store.state.msg}}</span></div>
    <Child :testProps='testProps' @child='handlerChild'/>
  </div>
</template>

export default {
  name: 'ParentView',

  data() {
    return {
      msgP:'',
    };
  },

  mounted() {
    
  },

  methods: {
    
  },
};

<style scoped>
.parent {
  width: 400px;
  height: 100px;
  /* background: pink; */
}
.msg {
  color: red;
}
</style>
  • 子组件
<template>
  <div class="child">
    <div>我是子组件</div>
    <button class="button" >porps传函数</button>
    <button class="button" >自定义事件</button>
    <button class="button" >全局事件总线</button>
    <button class="button" >消息订阅与发布</button>
    <button class="button" >vuex仓库</button>
  </div>
</template>

<script>
export default {
  name: 'ChildView',

  data() {
    return {
      
    };
  },

  mounted() {
    
  },

  methods: {
    
  },
};
</script>

<style scoped>
.child {
  width: 400px;
  height: 100px;
  /* background-color: skyblue; */
}
</style>

1、props传函数

思路:在父组件中定义一个函数,通过props传递给子组件,然后在子组件中调用父组件的函数,来将子组件的参数传递给父组件。

实现:

在父组件中定义一个函数给msg赋值(有形参!),再通过props传给子组件,在子组件调用

父组件:

methods: {
    // 测试将函数用props传给子组件,通过子组件调用
    testProps(msg){
      this.msgP = msg
    },
  },

子组件:

// 接收
props:['testProps'],
// 在click事件中调用
<button class="button" @click="testProps(msg1)">porps传函数</button>

子组件向父组件传参的几种方法

2、自定义事件

思路:在父组件中定义自定义事件,其内容为给父组件的msg赋值,在子组件中通过emit触发父组件中的自定义事件。

父组件:

// 定义自定义事件
<Child :testProps='testProps' @child='handlerChild'/>

methods: {
    // 自定义事件,在child事件触发的时候调用
    handlerChild(msg){
    	this.msgP = msg
    }
},

子组件:

// 通过click函数中,用emit触发自定义事件
<button class="button" @click="testEmit">自定义事件</button>

methods: {
    // 通过emit出发自定义事件child
    testEmit(){
    	this.$emit('child',this.msg2)
    },
},

子组件向父组件传参的几种方法

3、全局事件总线

思路:给vue原型链上绑定一个$bus,在bus上绑定事件和触发事件,便可以在各个组件中随意通信

main.js:

new Vue({
  render: h => h(App),
  // 在原型链上绑定bus
  beforeCreate(){
    Vue.prototype.$bus = this
  }
}).$mount('#app')

父组件:

  // 在生命周期函数上绑定
  mounted() {
    // 全局事件总线,将事件绑定在vue原型链的$bus上
    this.$bus.$on('testBus',(msg) =>{
      this.msgP = msg
    })
  },

子组件:

// 通过click函数中,用emit触发bus上的事件
<button class="button" @click="Bus">全局事件总线</button>

methods: {
    // 通过emit事件来出发$bus上的事件
    Bus(){
      this.$bus.$emit('testBus',this.msg3)
    },
  },

子组件向父组件传参的几种方法

4、消息订阅与发布

思路:通过pubsub-js插件实现,在子组件中发布消息,在父组件中接收消息

实现:

// 下载pubsub-js
npm -i pubsub-js

父组件:

// 导入pubsub
import pubsub from 'pubsub-js'

// 在生命周期函数中订阅testpubsub的信息
  mounted() {
    // 消息订阅,订阅testpubsub发布的消息
    this.pubId = pubsub.subscribe('testPubsub',(msgName, data) => {
      this.msgP = data
    })
  },

子组件:

// 通过点击函数触发
<button class="button" @click="publish">消息订阅与发布</button>

  methods: {
    // 消息发布函数,当消息发布,订阅的地方就会收到
    publish(){
      pubsub.publish('testPubsub',this.msg4)
    },
  },

子组件向父组件传参的几种方法

5、vuex仓库

思路:通过vuex插件,将数据存储到vuex里面各个组件都可以调用,自然解决了子组件向父组件传参的问题

实现:

// 下载vuex(vue2,使用3版本才不会报错
npm -i vuex(@3)

main.js初始化:

import store from './store/index'

new Vue({
  render: h => h(App),
  store,
  // 在原型链上绑定bus
  beforeCreate(){
    Vue.prototype.$bus = this
  }
}).$mount('#app')

新建文件夹store,新建文件index.js初始化

store/index.js:

// 引入vue
import Vue from 'vue'
// 引入vuex
import Vuex from 'vuex'

// 在vue身上使用vuex
Vue.use(Vuex)

// 新建一个store仓库,并将其暴露出去
export default new Vuex.Store({
  // vuex存储数据的地方
  state: {
    msg:'',
  },
  // 可以理解成vuex的computed?
  getters: {
  },
  // 对state中的数据修改
  mutations: {
    updateMsg(state,msg){
      state.msg = msg
    }
  },
  // 对数据进行预处理,或者是异步处理?
  actions: {
  },
  // 可以将仓库分解成小仓库
  modules: {
  }
})

父组件:

<div>仓库里的msg: <span class="msg">{{this.$store.state.msg}}</span></div>

子组件:

<button class="button" @click="updatemsg">vuex仓库</button>

methods: {
    // 通过此函数来更新仓库中的数据,在别的组件都可以调用
    updatemsg(){
    	this.$store.commit('updateMsg', this.msg5);
    }
}

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

仓库里的msg: {{this.$store.state.msg}}
```

子组件:

<button class="button" @click="updatemsg">vuex仓库</button>

methods: {
    // 通过此函数来更新仓库中的数据,在别的组件都可以调用
    updatemsg(){
    	this.$store.commit('updateMsg', this.msg5);
    }
}

子组件向父组件传参的几种方法
本人小白一枚,如有不对,欢迎各位大佬指正。
最后,附上 源码仓库地址
源地址:https://github.com/2019VK/child-parent.git文章来源地址https://www.toymoban.com/news/detail-451189.html

到了这里,关于子组件向父组件传参的几种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • taro跳转页面传参的几种方式

    我之前在网上也搜了挺多taro传参的方式,这里我总结一下 路由跳转分Taro.navigateTo与Taro.redirectTo, 但是这两种方法只适用于传递少量参数 Taro.navigateTo跳转时是将新的页面加载过来,最多加载到10层,返回时去的是上一页; Taro.redirectTo跳转的同时将当前页面销毁,返回时去的是

    2024年02月07日
    浏览(33)
  • 【Vue3】路由传参的几种方式

    路由导航有两种方式,分别是:声明式导航 和 编程式导航 参数分为query参数和params参数两种 1.传参 在路由路径后直接拼接 ?参数名:参数值 ,多组参数间使用 分隔。 如果参数值为变量,需要使用模版字符串。 2.接收与使用 1.传参 to不再传递字符,而是传一个对象,由于参数

    2024年02月21日
    浏览(41)
  • 微信小程序页面之间传参的几种方式

    目录 前言 第一种:url传值 url传值使用详细说明 api跳转 组件跳转 第二种:将值缓存在本地,再从本地取值 第三种:全局传值(应用实例传值) 第四种:组件传值 第五种:使用通信通道(通信通道是wx.navitageTo()独有的) 第六中:使用页面栈(只对当前页面栈中存在的页面生效

    2024年04月13日
    浏览(33)
  • 第三方组件及计算属性传参的问题解决方式

    唉,好想玩滋嘣。 表格数据某一列需要用的计算属性时,模板中使用计算属性 fullName 就会直接调用 fullName 函数,而在模板中 fullName(item) 相当于 fullName()(item) ,此处为函数柯里化。 封装好的组件的事件回调函数想要传其它参数,事件的回调直接写 :before-upload=\\\"beforeUpload(\\\'a\\\')

    2024年02月05日
    浏览(39)
  • 小程序页面路由传参的方法?

    在小程序中,可以使用页面路由传递参数。有以下几种方式可以实现: 通过 URL 参数传递:在跳转到目标页面时,可以在 URL 中添加参数。例如: 在目标页面的 onLoad 方法中可以通过 options 参数获取传递的参数: 通过全局变量传递:可以通过小程序的全局变量来传递参数。在

    2024年01月17日
    浏览(39)
  • vue引入组件的几种方法

    目录 一、常用的局部引入 二、创建一个js 进行统一注册   然后在main.js引入统一管理的js文件实现全局注册 三、自动注册全局引入 总结: 在哪个页面需要就在那个页面 引入 、 注册 、 使用 1、global.js统一注册管理: 2、在main.js中引入 global.js实现全局注册 优点: 减少每个

    2024年02月16日
    浏览(31)
  • vue子组件调用父组件方法的几种方式

    一、直接在子组件中通过  this.$parent.event来调用父组件方法 父组件 子组件 二、在子组件里用 $emit 向父组件触发一个事件,父组件监听这个事件 父组件 子组件 三、父组件将方法传入子组件,子组件直接调用 父组件 子组件

    2024年02月12日
    浏览(32)
  • 微信小程序跳转传参的方法

    目的: 带着第一个页面的id,传到第二个页面,实现同一个页面,点击不同商品显示对应的数据 首先在第一个页面的js文件中写好接口 随后在wxml中写上点击事件,注意这个 data-id=\\\"{{item.id}}\\\" 随后在写上点击事件 先console一个e 看需要拿到什么数据  console的结果是 currentTarget下

    2024年02月06日
    浏览(36)
  • WIn11关闭小组件窗口的几种方法

    最近经常无缘无故弹出小组件窗口,显得格外烦人,这货对于我来说完全没啥用,还占用部分系统资源,对于喜欢使用的童鞋,可以配置日历、天气、新闻之类的小组件。 下面是几种关闭小组件的方法。 按下组合键 win + I 进入系统设置 选择 个性化 - 任务栏 直接将任务栏功

    2024年02月12日
    浏览(54)
  • Vue3实现组件级基类的几种方法

    Vue3的组件有三种代码组织方式 纯Option API (不含setup) option API + setup 纯 setup (即composition API) 对于这三种形式,设置基类的方法也略有不同。 vue3提供了 mixins和extends,但是尝试之后发现这两种方法只支持纯OptionAPI,设置的data会被识别,但是设置的setup里return 的 reactive,完

    2024年02月01日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包