vue组件传参

本文介绍了Vue中多种组件间通信的方式,包括父传子(通过props接收),子传父(利用$emit触发事件传递),使用Vuex进行全局状态管理,通过eventBus实现事件总线通信,以及利用本地存储(localStorage, sessionStorage)进行数据缓存。同时,还提到了通过$parent和$refs以及router-link进行参数传递的方法。" 102967399,7402238,移动端搜索设计详解:一级、二级、三级搜索的区别与应用,"['移动开发', '用户体验', '搜索技术', '界面设计', '产品设计']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 父传子:在父组件的子组件标签上绑定传输的变量,在子组件中利用props接收
// 父组件
<template>
 <div class="home">
     <Bread :list='list' />
 </div>
</template>
<script>
import Bread from '../components/Bread'
export default {
 components:{Bread},
 data(){
   return {
     list:'哈哈哈'
   }
 }
}
</script>
//子组件	接收到的数据跟data中的数据是一样的用法
<template>
 <div>
     <h2>{{list}}</h2>
 </div>
</template>
<script>
export default {
   props:['list']
}
</script>
  1. 子传父:先在父组件的子组件标签上自定义一个事件调用方法
<template>
  <div class="home">
      <Bread :list='list' @arr='arr' />
  </div>
</template>
<script>
import Bread from '../components/Bread'
export default {
  components:{Bread},
  data(){
    return {
      list:'父传子'
    }
  },
  methods:{
    arr(stg){
      this.list = stg
    }
  }
}
</script>

在子组件中通过$emit来传输数据 ,第一个参数为自定义事件的名,第二个数据为要传输的数据

<template>
  <div>
      <h2 @click='arr'>{{list}}</h2>
  </div>
</template>
<script>
export default {
    props:['list'],
    data(){
      return {
        arrs:'子传父'
      }
    },
    methods:{
      arr(){
        this.$emit('arr',this.arrs)
      }
    }
}
</script>
  1. vuex:先在store中mutations上定义方法,然后在传输方使用store.commit()调用方法传输数据,第一个参数调用方法名,第二个参数为传输的数据
<template>
  <div class="home">
      <Bread @click='add' />
  </div>
</template>
<script>
import Bread from '../components/Bread'
export default {
  components:{Bread},
  data(){
    return {
      list:'vuex'
    }
  },
  methods:{
    add(){
      this.$emit.commit('getData',this.list)
    }
  }
}
</script>

在接收方用$store.state进行接收 数据可以直接时候

 <h2>{{$store.state.add}}</h2>
  1. eventBus(时间总线):在src中新建一个Bus.js的文件,然后导出一个空的vue实例
import Vue from 'vue';  
export default new Vue();

在传输数据的一方引入Bus.js 然后通过Bus.emit (“事件名”,“参数”)来派发事件,数据是以emit()的参数形式来传递

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    add:''
  },
  mutations: {
    getData(state,data){
      state.add = data
    }
  }
})
<template>
  <div>
    <button @click="doClick">点击兄弟传值</button>
  </div>
</template>
<script>
import Bus from "../bus.js";
export default {
  data() {
    return {
      actor: "Hollow",
    };
  },
  methods: {
    doClick() {
      Bus.$emit("getValue", this.actor);
    },
  },
};
</script>

在接受的数据的一方 引入 Bus.js 然后通过 Bus.$on(“事件名”,(data)=>{data是接受的数据})

<template>
  <div>
    {{ actor }}
  </div>
</template>
<script>
import Bus from "../bus.js";
export default {
  data() {
    return {
      actor: "",
    };
  },
  methods: {},
  created() {
      Bus.$on("getValue",(str)=>{
        this.actor=str
      })
  },
};
</script>
  1. 本地存储(localStorage,sessionStorage)
    两个组件A和B,在A组件设置要缓存的orderData
let orderData = { order: 123, price: 111 };
localStorage.setItem('shop',JSON.stringify(orderData))

B组件就可以获取到A组件中设置的缓存了

let shopcart=JSON.parse(localStorage.getItem('shop'))
console.log(shopcart);
  1. 先在src下边创建一个Global.js文件,里面定义一些变量初始状态,
exports.install = function (Vue) {Vue.prototype.token='123123' }

在程序入口的main.js文件里面,将上面那个Global.vue文件挂载到Vue.prototype。

import Global from "./Global"
Vue.use(Global)

挂载后,直接用就可以了,代码如下:

<template>
  <div>
    {{ token }}
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
};
</script>
  1. 使用router-link进行路由导航,传递参数
<router-link to="/son/123"> <button>点我</button></router-link>
使用this.$route.params.num来接收路由参数
<template>
  <div>
    {{num}}>
  </div>
</template>
<script>
export default {
  data() {
    return {
      num:0,
    };
  },
  created() {
    this.num=this.$route.params.num
  },
};
</script>
直接调用$router.push 实现参数的跳转
<template>
  <div>
    <li v-for="item in 3" :key="item" @click="toSon(item)">
      {{ item }}
    </li>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  methods: {
    toSon(id) {
      this.$router.push({
        path: `/son/${id}`,
      });
    },
  },
};
</script>
{{this.$route.params.id}}
通过query来传递参数
<template>
  <div>
    <button @click="toSon">1</button>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  methods: {
    toSon() {
      this.$router.push({
        path: "/son",
        params: {
          id: 1,
        },
      });
    },
  },
};
</script>
{{this.$route.query.id}}
  1. $parent和Children
let Son = {
        template:`<div>
            {{ name }} {{ position }}<button @click="ChangeName">Change Parent Name</button>
        </div>`,
        data(){
            return{
                name:'Son',
                position:'son'
            }
        },
        methods:{
            ChangeName(){
                this.$parent.name = 'Have Change';//设置父级的name为xxx
            }
        }
    };
    let App = {
        template: `<div id="app">
        {{ name }}
        {{ position }}
        <button @click="send">Pass Value</button>
        <hr><Son/>
        </div>`,
        data(){
            return{
                name:"App",
                age:21,
                position:'parent',
                message:'From App'
            }
        },
        components:{
            Son
        },
        methods:{
            send(){
                this.$children[0].name = "change";//设置它的第一个子元素,即子组件的name为 xxx
            }
        }
    };
  1. $refs
    父组件
<v-header ref="headerTY"></v-header>
 <button @click="getData">父组件获取子组件的值和方法</button>
<script>
import Header from './header';
export default {
  data(){
    return{
        msg:'这是一个首页组件',
        name:'首页',
        dataone:'首页第一个数据',
        title:'111'
    }
  },
  components:{
      'v-header':Header
  },
  methods:{
      getData(){
        // console.log(this.$refs.headerTY.msg)
        this.$refs.headerTY.run();
      },
      Yun(){
        alert('父组件')
      }
  }
 
 
}
</script>
子组件
<template>
  <div id="app1">
    {{msg}}
    <button @click="getParent()">获取付父组件的值和方法</button>
   <hr>
  </div>
</template>
<script>
export default {
  data(){
    return{
        msg:'这是一个头部组件',
        didi:''
    }
  },
  methods:{
    run(){
      alert(111)
    },
    getParent(){
      alert(this.$parent.name);
    }
  }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值