Vue 组件之间的传值

一、父组件给子组件传值

  • 在父组件中注册导入使用子组件
  • 在父组件中创建变量,并动态绑定给子组件
  • 子组件使用props 来接收变量值,并进行显示绑定,可在接受传值的时候,规定传值的类型

子组件如何获取父组件整个对象:

  1. 父组件中绑定 :parent="this"   在子组件中获取this.$parent
  2. 在子组件中通过props获取parent(类似于父组件给子组件传值,子组件通过props获取父组件传的值)

App.vue组件

<template>
  <div id="app">
    <div class="par_b">
      <p>{{msg}}</p>
      <home :title="toHome" :parent="this" :bool="isshow" :tofun="getchild"></home>
      <list></list>
    
    </div>
  </div>
</template>

<script>
import Home from "./Components/Home.vue";
import List from "./Components/List.vue";
export default {
  name: "app",
  components: {
    "home": Home,
    "list":List
  },
  data() {
    return {
      msg: "我是根组件",
      toHome:"测试父组件和子组件传值",
      isshow:true
    };
  },
  methods:{
    getchild(){
      console.log(1);
    },
  }
};
</script>

<style lang="scss">
#app {
  div.par_b {
    width: 300px;
    height: 500px;
    border: 2px solid black;
    margin: 0 auto;
    p {
      text-align: center;
    }
  }
}
</style>

Home.vue组件

<template>
  <div id="home">
    <p>{{msg}}</p>
    <p>{{title}}</p>
    <p>{{bool}}</p>
  </div>
</template>
<script>
export default {
 //子组件获取父组件
  props: ["title", "bool", "tofun","parent"],
 
  // props:{
  //     'title':String,  字符串
  //     'tobool':Boolean,    boolean
  //     'tofun':Function     函数方法
  // },

  mounted() {
    this.tofun();

    //子组件里面可以直接获取父组件
    console.log(this.$parent);
    console.log(this.$parent.isshow);

    })
   
  },
  data() {
    return {
      msg: "我是home组件",

    };
  },
  }
};
</script>

二、子组件给父组件传值

  • 问:父组件如何获取子组件
  • 答: ref设置子组件虚拟节点 通过虚拟dom节点获取整个子组件对象$refs
  • 问:父组件如何使用子组件里面的方法和属性
  • 答:可在父组件里获取子组件的整个对象以后,利用“对象.属性”和“对象.方法”进行使用
<template>
  <div id="app">
    <div class="par_b">
      <p>{{msg}}</p>
      <!-- 
     父组件如何使用子组件里面的方法和属性  ref设置子组件虚拟节点    通过虚拟dom节点获取整个子组件对象$refs
      -->
      <home ref="homedata" :title="toHome" :bool="isshow" :tofun="getchild"></home>
      <button @click="getchildmsg">获取子组件的方法属性</button>
      <list></list>
    
    </div>
  </div>
</template>

<script>
import Home from "./Components/Home.vue";
import List from "./Components/List.vue";
export default {
  name: "app",
  components: {
    "home": Home,
    "list":List
  },
  data() {
    return {
      msg: "我是根组件",
      toHome:"测试父组件和子组件传值",
      isshow:true
    };
  },
  methods:{
    getchild(){
      console.log(1);
    },
    getchildmsg(){
        //通过虚拟dom节点获取整个子组件对象
        let homelist=this.$refs.homedata;
         console.log(homelist.msg);  //我是home组件
    }
  }
};
</script>

<style lang="scss">
#app {
  div.par_b {
    width: 300px;
    height: 500px;
    border: 2px solid black;
    margin: 0 auto;
    p {
      text-align: center;
    }
  }
}
</style>

三、非父组件之间的传值

不建议使用子父间的传值,使用vue里面的全局广播,即事件的监听

  • 要做广播,需建一个全局文件(在src里新建一个名为Emit的文件夹,在该文件夹里新建一个名为Emit.js的文件);
  • 在Emit.js里实例化vue对象;
//实例化vue对象
import Vue from 'vue';
let emit=new Vue();
export default emit;

注:整个vue环境里就一个new vue,这个new vue就是进行全局广播;

  • 在哪里广播,在哪导入vue的全局对象;
import Emit from '../Emit/Emit.js';

注:广播和接收广播都需导入vue全局对象

  • 触发广播 Emit.$emit("事件名称",传送的数据);

List.vue给Home.vue组件传值,在List.vue中触发广播

<template>
  <div id="list">
      <p>{{msg}}</p>
        <!-- 
            list组件给home组件传值  广播  (非父之间传值)
        -->
        <button @click="sendhome">给home组件传值</button>
  </div>
</template>
<script>
//导入全局vue对象
import Emit from '../Emit/Emit.js';
export default {
  name: "list",
  data(){
      return {
          msg:"我是list组件",
          tohome:"接受广播",
      }
  },
  methods:{
      sendhome(){
         //触发广播
         Emit.$emit("tohomedata",this.tohome);
      }
  }
};
</script>
<style lang='scss'>
</style>

Home.vue组件-接收数据

  • 在mounted生命周期中,接收广播       Emit.$on("事件名称",传送的数据);
<template>
  <div id="home">
    <p>{{msg}}</p>
    <p>{{title}}</p>
    <p>{{bool}}</p>
    <p>{{listData}}</p>
  </div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
   
  //子组件获取父组件
  // props:{
  //     'title':String,  字符串
  //     'tobool':Boolean,    boolean
  //     'tofun':Function     函数方法
  // },

  mounted() {
    this.tofun();

    //子组件里面可以直接获取父组件
    console.log(this.$parent);
    console.log(this.$parent.isshow);
    //接受非父组件之间的广播传值  监听tohomedata
    Emit.$on("tohomedata",(res)=>{
      this.listData=res;
    })
   
  },
  data() {
    return {
      msg: "我是home组件",
      listData:null,    //传来的值需打印上去进行绑定 
    };
  },
  }
};
</script>

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值