• Vue---8种组件传值方式总结,总有一款适合你


    目录

    父子传值

    子父传值

    非父子传值

    router路由传参query/params

    路由组件方式传值[:xxx]

    vuex状态管理工具传值

    本地缓存传值 localStorage/sessionStorage

    注入的方式传值 provide/inject

     消息订阅与发表pubsub-js


    父子传值

    1. 1. 父组件中的子组件标签上使用 :属性名 的方式来传值
    2. -------------------------------------------
    3. <div id="app">
    4. <child-component :childItem="childItem">child-component>
    5. div>
    6. 2. 子组件中的props中接父组件子组件标签的对应属性名
    7. -------------------------------------------
    8. // 字符串形式
    9. props: ['postTitle']
    10. // 多类型的props
    11. props: {type: [String,Boolean], default:''}
    12. // 默认值形式
    13. props: {
    14. childItem:{
    15. type: Object,
    16. default() {
    17. return {}
    18. }
    19. },
    20. childArr:{
    21. type:Array,
    22. default(){
    23. return []
    24. }
    25. },
    26. childBoolean:{
    27. type:Boolean,
    28. default: true
    29. },
    30. childStr:{
    31. type:String,
    32. default: ''
    33. },
    34. childNumber:{
    35. type:Number,
    36. default: 0
    37. },
    38. childFun:{
    39. type:Function,
    40. default(){
    41. return (x)=>{console.log(x)}
    42. }
    43. }
    44. },
    45. // 声明传值的数据类型
    46. props: {
    47. title: String,
    48. likes: Number,
    49. isPublished: Boolean,
    50. commentIds: Array,
    51. author: Object,
    52. callback: Function,
    53. contactsPromise: Promise // or any other constructor
    54. }

    子父传值

    1. 主要知识点:$emit
    2. 子组件中:
    3. this.$emit('自定义事件名', 要传的值)
    4. 父组件的子组件标签上:
    5. "childItem" @自定义事件名='handleEmit'>
    6. handleEmit(emit){console.log(emit) // 要传的值}

    非父子传值

    1. 在全局main.js
    2. const Bus = new Vue()
    3. Vue.prototype.Bus = Bus
    4. 在同级或者其他关系的组件中:
    5. A组件中传出来值:this.Bus.$emit('自定义事件名',要传的值)
    6. B组件中接收传值:this.Bus.$on('自定义事件名',function(emit){console.log(emit);
    7. // 传过来的值})

    router路由传参query/params

    1. 路由跳转时,采用路由参数去传参:
    2. 1. query,即get形式传参,页面路由可以看到参数
    3. this.$router.push/replace({
    4. path:'/xxx/detail',
    5. query:{name:xxx,age:xxx}
    6. })
    7. detail页面中获取:this.$route.query.name/this.$route.query.age
    8. 2. params的方式,即post的形式传参,页面路由看不到
    9. 注意事项:该传参形式路由router对象中必须要写上对应页面的name名称。否则传值无效
    10. this.$router.push/replace({
    11. name:'Detail'
    12. path:'/xxx/detail', // 此时该路径可写可不写
    13. params:{name:xxx,age:xxx}
    14. })
    15. detail页面中获取:this.$route.params.name/this.$route.params.age
    16. // 该形式的写法缺失name,detail组件中无法获取到name/age参数
    17. this.$router.push/replace({
    18. path:'/xxx/detail',
    19. params:{name:xxx,age:xxx}
    20. })

    路由组件方式传值[:xxx]

    1. 这里先说明下,采用:xxx的形式,获取时使用params的形式获取,不能使用query!
    2. router.js 配置:
    3. {
    4. path: '/singer/:singer',
    5. name: 'Singer',
    6. component: Singer,
    7. children: [{ path: ':id', component: SingerDetail }]
    8. }
    9. vue文件中跳转时:
    10. this.$router.push({
    11. name: 'Detail',
    12. path:`/detail/${this.id}`
    13. })
    14. detail组件中:获取singer值
    15. this.$route.params.singer // 2

    vuex状态管理工具传值

    1. 适用场景:
    2. 父子组件、兄弟组件、无关系组件任意组件之间的传值
    3. vuex的具体配置自行搜索,这里主要说下怎么获取到vuex中的值:
    4. vuex包含四个部分:state、mutations、actions、getters
    5. state:vuex的仓库,即存储数据的地方
    6. mutations:同步方法的对象,直接修改或赋值state中的值
    7. actions:使用异步方法或者间接操作state中的值
    8. getters: 目的就是为了写对应的方法,用来直接获取state中的值
    9. vuex中:
    10. state:{count:1}
    11. var mutations = {
    12. incCount(){
    13. ++state.count;
    14. }
    15. }
    16. //类似于计算属性 state里边的数据改变时候触发的方法。 可以做一些操作 并且可以有返回值
    17. var getters={
    18. completedCountChange(state){
    19. return state.count * 2 +'位';
    20. }
    21. }
    22. //action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态。
    23. Action 可以包含任意异步操作
    24. var actions = {
    25. asynIncCount(context){
    26. //因此你可以调用context.commit来提交一个mutation 使用action需要用dispatch
    27. context.commit('incCount');
    28. }
    29. }
    30. 页面中直接使用vuex中数据:
    31. 使用数据: this.$store.state.count
    32. 调用方法: this.$store.commit('incCount'); this.$store.dispatch('asynIncCount')

    本地缓存传值 localStorage/sessionStorage

    1. localStorage:
    2. 1.存储数据:localStorage.setItem(“自定义数据名”, 数据)
    3. 2.取存储的本地数据:localStorage.getItem(“存储数据的数据名”)
    4. 3.删除指定的本地数据:localStorage.removeItem(“存储数据的数据名”)
    5. 4.删除当前域名下所有内容:localStorage.clear()
    6. sessionStorage:
    7. 1.存储数据:sessionStorage.setItem(“自定义数据名”, 数据)
    8. 2.取存储的本地数据:sessionStorage.getItem(“存储数据的数据名”)
    9. 3.删除指定的本地数据:sessionStorage.removeItem(“存储数据的数据名”)
    10. 4.删除当前域名下所有内容:sessionStorage.clear()

    注入的方式传值 provide/inject

    1. 形式一:常见的方式
    2. // parent component providing 'foo'
    3. var Provider = {
    4. provide: {
    5. foo: 'bar'
    6. },
    7. // ...
    8. }
    9. // child component injecting 'foo'
    10. var Child = {
    11. inject: ['foo'],
    12. created () {
    13. console.log(this.foo) // => "bar"
    14. }
    15. // ...
    16. }
    17. 形式二:ES2015符号函数 提供 和对象 注入
    18. const s = Symbol()
    19. const Provider = {
    20. provide () {
    21. return {
    22. [s]: 'foo'
    23. }
    24. }
    25. }
    26. const Child = {
    27. inject: { s },
    28. // ...
    29. }
    30. 形式三:解决作为props的默认参数值,data中变量的默认值
    31. 使用inject的注入值作为默认值:
    32. const Child = {
    33. inject: ['foo'],
    34. props: {
    35. bar: {
    36. default () {
    37. return this.foo
    38. }
    39. }
    40. }
    41. }
    42. 使用一个注入值作为data数据输入:
    43. const Child = {
    44. inject: ['foo'],
    45. data () {
    46. return {
    47. bar: this.foo
    48. }
    49. }
    50. }
    51. 形式四:注入的默认值的形式
    52. If it needs to be injected from a property with a different name, use from to denote
    53. the source property:
    54. const Child = {
    55. inject: {
    56. foo: {
    57. from: 'bar',
    58. default: 'foo'
    59. }
    60. }
    61. }
    62. Similar to prop defaults, you need to use a factory function for non primitive
    63. values:
    64. const Child = {
    65. inject: {
    66. foo: {
    67. from: 'bar',
    68. default: () => [1, 2, 3]
    69. }
    70. }
    71. }

     消息订阅与发表pubsub-js

    1. 1.一种组件间通信的方式,适用于任意组件间通信
    2. 2.引入: import pubsub from 'pubsub-js'
    3. -------------------------------------------
    4. A组件声明对应的接收函数:参数一就是事件名pubsub,参数二就是执行处理函数
    5. created或mounted中:
    6. this.token = PubSub.subscribe('pubsub', (event, data) => {
    7. this.$my_console('测试PubSub:', event, data) //测试PubSub: pubsub hello world!
    8. this.singerItem = data
    9. });
    10. 同时A组件中做销毁处理:
    11. beforeUnmount(vue3)/beforeDestory(vue2.x)
    12. beforeUnmount() {
    13. PubSub.unsubscribe(this.token)
    14. // 1. 如果只是当前页面相关组件跳转来用,这里尽量写上销毁来优化页面性能
    15. // 2. 但是如果就一个或者其他非同级的页面切换时删掉,否则切换后会被销毁无法获取对应数据!
    16. }
    17. -------------------------------------------
    18. 任意B组件中去传值:参数一就是事件名pubsub,参数二就是入参(参数一事件名和发布时的要一致!!!)
    19. PubSub.publish('pubsub', 'hello world!');
    20. -------------------------------------------
    21. 触发时机:当从A组件进入任意关系的B组件中时,只要事件名相同就会触发A组件的中函数
    22. 处理B组件传入的参数(任意形式的参数)
    23. 使用场景:用于监听进入的组件,或者进入组件是要改变上一个组件的相关值或者展示内容
    24. 是否通用:一般情况下不会使用,除非特别需求才会引入项目

  • 相关阅读:
    lstm单变量单步预测
    无人自动驾驶技术研发中具有重要性
    [leecode]快速排序
    【Linux学习】- POSIX多线程技术
    你真的会用苹果备忘录吗?iPhone用户必须学会的10个备忘录使用技巧
    k8s中emqx使用ssl证书及官方chart修改示例
    【Vue3从零开始-实战】S10:Toast弹窗组件开发
    一个 SAP 开发工程师在 SAP 德国总部出差的见闻系列 1:出差 ≠ 公费旅游
    就业 | 面试签约问题
    Python函数的默认参数值在定义函数时已经生成,不能使用可变对象
  • 原文地址:https://blog.csdn.net/COCOLI_BK/article/details/126225952