Vue组件传值 父传子 子传父 兄弟组件传值

vue父级组件给子级组件传值

父组件给子组件传值 :collapsed="collapsed" ,子组件通过props接收父组件传递的值  props: ["collapsed"]  

子组件给父组件传值 this.$emit('func',val)    ,父组件通过定义方法  @func="getVal"       来接收子组件传递过来的值

兄弟组件传值  首先组件A通过    this.$emit('func',val)   给父组件传值,然后组件B通过props来接收组件A传给父组件的值

 

父组件

<template>
  <a-layout id="components-layout-demo-custom-trigger">
    <Sider :collapsed="collapsed" @func="getVal"></Sider>
    <a-layout>
      <Header :collapsed="collapsed" @getCollapsed='getCollapsed'></Header>
      <Content></Content>
    </a-layout>
  </a-layout>
</template>
<script>
import Sider from './Sider'
import Header from './Header'
import Content from './Content'
export default {
  data() {
    return {
      collapsed: false
    };
  },
  components:{
    Sider,
    Header,
    Content
  },
  methods: {
    getCollapsed(val){
      this.collapsed = val
    },
    getVal(val){
      this.collapsed = val
    }
  }
};
</script>
<style>
#components-layout-demo-custom-trigger {
  height: 100%;
}
#components-layout-demo-custom-trigger .trigger {
  font-size: 18px;
  line-height: 64px;
  padding: 0 24px;
  cursor: pointer;
  transition: color 0.3s;
}

#components-layout-demo-custom-trigger .trigger:hover {
  color: #1890ff;
}

#components-layout-demo-custom-trigger .logo {
  height: 32px;
  background: rgba(255, 255, 255, 0.2);
  margin: 16px;
}
</style>

 

子组件A

<template>
  <a-layout-header style="background: #fff; padding: 0">
    <a-icon
      class="trigger"
      :type="collapsed ? 'menu-unfold' : 'menu-fold'"
      @click="collapseds"
    />
  </a-layout-header>
</template>
<script>
export default {
  props:['collapsed'],
  data() {
    return {
      
    };
  },
  methods: {
    collapseds(){
      this.getcollapsed = !this.getcollapsed
    },
  },
  computed:{
    getcollapsed:{
      get(){
        return this.collapsed
      },
      set(val){
        this.$emit('getCollapsed',val)
      }
    }
  }
};
</script>
<style>

</style>

 

 

子组件B

<template>
  <a-layout-sider
    :trigger="null"
    collapsible
    v-model="getCollapsed"
    breakpoint="lg"
    @collapse="onCollapse"
    @breakpoint="onBreakpoint"
  >
    <div class="logo" />
    <a-menu theme="dark" mode="inline" :defaultSelectedKeys="['1']">
      <a-menu-item key="1">
        <a-icon type="user" />
        <span>nav 1</span>
      </a-menu-item>
      <a-menu-item key="2">
        <a-icon type="video-camera" />
        <span>nav 2</span>
      </a-menu-item>
      <a-menu-item key="3">
        <a-icon type="upload" />
        <span>nav 3</span>
      </a-menu-item>
    </a-menu>
  </a-layout-sider>
</template>
<script>
export default {
  props: ["collapsed"],
  data() {
    return {
    };
  },
  methods: {
    onCollapse(getCollapsed, type) {
      console.log(getCollapsed, type);
    },
    onBreakpoint(broken) {
      console.log(broken);
    }
  },
  computed:{
    getCollapsed: {
      get(){
        return this.collapsed
      },
      set(val){
        this.$emit('func',val)
      }
    }
  },
};
</script>
<style>
</style>

 

在组件传值中子组件改变props的值报错如下

 

 

解决方法

在组件传值中如果子组件想要改变props的值的数据必须通过 计算属性  computed  去改变父组件的值

computed:{
    getCollapsed: {
      get(){
        return this.collapsed
      },
      set(val){
        this.$emit('func',val)
      }
    }
  },

 

posted @ 2020-04-08 11:42  沉迷代码无法自拔  阅读(210)  评论(0编辑  收藏  举报