vue中传值的方法

本文介绍了Vue中组件间的通信方式,包括父传子(props)、子传父($emit和事件)、兄弟组件传值、使用Vuex进行任意组件传值以及祖孙组件间的provide/inject通信。Vuex作为状态管理器,提供响应式数据,可结合localstorage持久化数据。提供/注入API用于解决跨级组件通信问题。

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

1,父传子

父组件通过props向下传递数据给子组件

//App.vue父组件
<template>
  <div id="app">
    <users v-bind:users="users"></users>//前者自定义名称便于子组件调用,后者要传递数据名
  </div>
</template>
<script>
import Users from "./components/Users"
export default {
  name: 'App',
  data(){
    return{
      users:["Henry","Bucky","Emily"]
    }
  },
  components:{
    "users":Users
  }
}
​
​
​
​
//users子组件
<template>
  <div class="hello">
    <ul>
      <li v-for="user in users">{{user}}</li>//遍历传递过来的值,然后呈现到页面
    </ul>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld',
  props:{
    users:{           //这个就是父组件中子标签自定义名字
      type:Array,
      required:true
    }
  }
}
</script>
​
​

2,子传父

#ref传值

#通过事件形式:子组件通过$emit()给父组件发消息,父组件通过v-on绑定事件接收数据

//zi zujian
<template>
    <p @click="change">{{title}}//绑定点击事件
    </p>
</tempalte>
<script>
​
    export default{
        name:"app-header"
        data:{
            return {
            title:"vue"
            }
        },
        methods:{
        change(){
        this.$emit("zichaunfu","传值")//自定义事件,穿的值是”传值
        }
        }
    }
</script>
​
​
//父组件
<template>
    //与子组件自定义事件名字保持一致,data表示从子组件传过来的数据
    <app-header  v-on:zichaunfu="data" ></app-header>
    <p>{{title}} </p>
</template>
<script>
    import app-header from "./compents"
    export default{
        name:"app",
        data(){
            return{
            title:"传递过来是一个值"
            }
        },
        methods:{
            data(e){//声明这个函数
            this.title=e
            }
        },
        compents:{
        "app-heander":header,
        }
    }
</script>
​
​

子组件通过events给父组件发送消息,实际上就是子组件把自己的数据发送到父组件

3,兄弟组件传值

原理:

var event =new vue()
event.$emit(事件名,数据)
event.$on(事件名,data=》{})//箭头函数内部不会产生新的this,这边如果不用=》,this指代event
从c组件获取a和b组件的值
​
<div id="itany">
    <my-a></my-a>
    <my-b></my-b>
    <my-c></my-c>
</div>
<template id="a">
  <div>
    <h3>A组件:{{name}}</h3>
    <button @click="send">将数据发送给C组件</button>
  </div>
</template>
<template id="b">
  <div>
    <h3>B组件:{{age}}</h3>
    <button @click="send">将数组发送给C组件</button>
  </div>
</template>
<template id="c">
  <div>
    <h3>C组件:{{name}},{{age}}</h3>
  </div>
</template>
<script>
var Event = new Vue();//定义一个空的Vue实例
var A = {
    template: '#a',
    data() {
      return {
        name: 'tom'
      }
    },
    methods: {
      send() {
        Event.$emit('data-a', this.name);
      }
    }
}
var B = {
    template: '#b',
    data() {
      return {
        age: 20
      }
    },
    methods: {
      send() {
        Event.$emit('data-b', this.age);
      }
    }
}
var C = {
    template: '#c',
    data() {
      return {
        name: '',
        age: ""
      }
    },
    mounted() {//在模板编译完成后执行
     Event.$on('data-a',name => {
         this.name = name;//箭头函数内部不会产生新的this,这边如果不用=>,this指代Event
     })
     Event.$on('data-b',age => {
         this.age = age;
     })
    }
}
var vm = new Vue({
    el: '#itany',
    components: {
      'my-a': A,
      'my-b': B,
      'my-c': C
    }
}); 
</script>
​

4,任意组件传值(vuex)

Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。

###vuex和localstorage关系

vuex是vue的状态管理器,储存的数据是响应式的。但是不会保存起来,一刷新就会丢失,所以可以把vuex的数据保存一份到localstorage里面,刷新之后,如果localstorage里面有保存的数据,取出来替换store里的state

let defaultCity = "上海"
try {   // 用户关闭了本地存储功能,此时在外层加个try...catch
  if (!defaultCity){
    defaultCity = JSON.parse(window.localStorage.getItem('defaultCity'))
  }
}catch(e){}
export default new Vuex.Store({
  state: {
    city: defaultCity
  },
  mutations: {
    changeCity(state, city) {
      state.city = city
      try {
      window.localStorage.setItem('defaultCity', JSON.stringify(state.city));
      // 数据改变的时候把数据拷贝一份保存到localStorage里面
      } catch (e) {}
    }
  }
})
​

再vuex中,保存的状态都是数组,而localstorage只支持字符串,所以需要转化一下

Json.parse(localstorage.getitem("")) string---->array

json.stringify(state.sub) array=====>string

5,祖孙组件传值(provide/inject)

以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。一言而蔽之:祖先组件中通过provider来提供变量,然后在子孙组件中通过inject来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系

//a.vue
​
export default{
    provide:{name:"haha "}
}
​
​
//b.vue
​
export default{
    inject:["name"]
    mounted:{
        log("this.name")//haha
    }
}

需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值