Vue2父子传值

Vue2父子传值

一、父子组件传值的多种方式

1.1父组件调用子组件

  • 通过props
  • 通过ref
  • 通过$children

1.2子组件调用父组件

  • 通过$emit
  • 通过provide/inject
  • 通过$parent

二、父组件调用子组件——使用步骤

1.父组件通过 props 传值,可传属性,方法

代码如下(示例):

父组件

<template>
  <div>
    <h1>父组件</h1>
    <Son1 :parentMethod="mytMethod" :isShow="isShow" />
  </div>
</template>
  
  <script>
import Son1 from "./components/son1.vue";

export default {
  name: "test",
  components: {
    Son1,
  },
  data() {
    return {
      isShow: true,
    };
  },
  methods: {
    mytMethod() {
      console.log("触发了父组件的方法");
      this.isShow = !this.isShow;
    },
  },
};
</script>

子组件

<template>
  <div>
    <h4>子组件</h4>
    <button @click="parentMethod">点我</button>
    <div v-if="isShow">控制显示</div>
  </div>
</template>

<script>

export default {
    props:{
        parentMethod:{
            type:Function,
            default:()=>{}
            
        },
        isShow:{
            type:Boolean,
            default:false
        }
    }

}
</script>

2.父组件通过 ref 获取子组件的实例,直接调用子组件的方法。

代码如下(示例):

父组件:

<template>
  <div>
    <h1>父组件</h1>
    <button @click="changeSon1">点我修改子组件显示列表</button>
    <Son1 ref="son1"  />
  </div>
</template>
  
  <script>
import Son1 from "./components/son1.vue";

export default {
  name: "test",
  components: {
    Son1,
  },

  methods: {
   
    changeSon1(){
      let list = ['我是新的列表','哈哈哈']
      this.$refs.son1.setListData(list)
    }
  },
};
</script>

子组件:

<template>
  <div>
    <h4>子组件</h4>
    <ul v-for="(item, index) in list" :key="index">
      <li>{{ item }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ["默认"],
    };
  },
  methods: {
    setListData(listData) {
      this.list = listData;
    },
  },
};
</script>

3.父组件通过 $children 获取子组件的实例的集合。

父组件:

<template>
  <div>
    <h1>父组件</h1>
    <button @click="changeMsg">点我更新子组件</button>
    <Son1 />
    <Son2 />
  </div>
</template>
  
  <script>
import Son1 from "./components/son1.vue";
import Son2 from "./components/son2.vue";

export default {
  name: "test",
  components: {
    Son1,
    Son2,
  },
  data() {
    return {
    };
  },                                  
  methods:{
    changeMsg(){
      console.log(this.$children);//[VueComponent, VueComponent] 子组件实例集合
      this.$children[0].getData();
      this.$children[1].getData();
      this.$children[0].msg ='111'
      console.log(this.$children[0].msg );
      console.log(this.$children[1].msg);

    }
  }
};
</script>

子组件:

<template>
  <div>
    <h4>子组件1</h4>
   
    <div>{{ msg }}</div>
  </div>
</template>

<script>
export default {
  name:"son1",
  data() {
    return {
      msg: "子组件1默认",
    };
  },
  methods: {
    getData() {
      this.msg = "子组件1更新";
    },
  },
};
</script>
<template>
  <div>
    <h4>子组件2</h4>
   
    <div>{{ msg }}</div>
  </div>
</template>

<script>
export default {
  name:"son2",
  data() {
    return {
      msg: "子组件2默认",
    };
  },
  methods: {
    getData() {
      this.msg = "子组件2更新";
    },
  },
};
</script>

三、子组件调用父组件——使用步骤

1.子组件通过 $emit 触发父组件方法

代码如下(示例):

子组件

<template>
  <div>
    <h4>子组件</h4>
    <button @click="changeM">点我修改父组件msg</button>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    changeM() {
      this.$emit("changeMsg", "新的了!辛德瑞拉");
    },
  },
};
</script>

父组件

<template>
  <div>
    <h1>父组件</h1>
    <div>{{ msg }}</div>
    <Son1 @changeMsg="changeMsg" />
  </div>
</template>
  
  <script>
import Son1 from "./components/son1.vue";

export default {
  name: "test",
  components: {
    Son1,
  },
  data() {
    return {
      msg: "父組件默认值",
    };
  },
  methods: {
    changeMsg(newVal) {
      this.msg = newVal;
    },
  },
};
</script>

2.provide/inject

代码如下(示例):

父组件

<template>
  <div>
    <h1>父组件</h1>

    <Son1 />
  </div>
</template>
  
  <script>
import Son1 from "./components/son1.vue";

export default {
  name: "test",
  components: {
    Son1,
  },
  data() {
    return {
      parentMsg:"eee"
    };
  },
  provide() {
    return {
      myMethod: () => this.myMethod(),//响应式方法,绑定this
      parentMsg: () => this.parentMsg,//响应式的值,绑定this
      parentColor: 'red',//非响应式的值
    };
  },
  methods:{
    myMethod(){
      console.log("组件方法被调用");
      this.parentMsg +="a"
    
    }
  }

子组件:

<template>
  <div>
    <h4>子组件</h4>
    <button @click="myMethod">点我</button>
   响应式: {{parentMsg()}}
  非响应式:  {{parentColor  }}
  </div>
</template>

<script>
export default {
  inject: ["myMethod",'parentMsg','parentColor'],
  data() {
    return {};
  },
  methods: {},
};
</script>

3.$parent 子组件获取父组件的数据、调用父组件的方法

父组件

<template>
  <div>
    <h1>父组件</h1>

    <Son1 />
  </div>
</template>
  
  <script>
import Son1 from "./components/son1.vue";

export default {
  name: "test",
  components: {
    Son1,
  },
  data() {
    return {
      parentMsg:"父组件的值"
    };
  },                                  
  methods:{
    myMethod(){
      console.log("父组件方法被调用");
      
    
    }
  }
};
</script>

子组件:

<template>
  <div>
    <h4>子组件</h4>
  <button @click="getData">点我</button>
  <div>{{ msg }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg:"子组件默认"
    };
  },
  methods: {
    getData(){
      this.$parent.myMethod()
      this.msg = this.$parent.parentMsg;
    }
  },
};
</script>

注意:如果子组件被第三方组件库包裹,比如vant UI(插槽使用)时,this.$parent获取到的是第三方库组件的实例(多层包裹,不建议使用)。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了父子传值的方式,具体的使用,大家根据具体开发需求使用。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2和Vue3中,父子组件之间传值的方式有一些区别。 在Vue2中,父组件可以通过props属性将数据传递给子组件,子组件通过props选项来接收父组件传递过来的值。父组件可以在模板中使用v-bind指令来传递数据,子组件可以通过props选项来定义接收的属性。 示例代码如下: 父组件: ``` <template> <div> <child-component :message="message"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { data() { return { message: 'Hello from parent component' }; }, components: { ChildComponent } }; </script> ``` 子组件: ``` <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] }; </script> ``` 在Vue3中,引入了Composition API,可以使用ref和reactive等函数来创建响应式数据,并使用provide和inject函数来进行父子组件之间的传值。 示例代码如下: 父组件: ``` <template> <div> <child-component></child-component> </div> </template> <script> import { provide, ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; export default { setup() { const message = ref('Hello from parent component'); provide('message', message); return { message }; }, components: { ChildComponent } }; </script> ``` 子组件: ``` <template> <div> <p>{{ message }}</p> </div> </template> <script> import { inject } from 'vue'; export default { setup() { const message = inject('message'); return { message }; } }; </script> ``` 所以,Vue3中使用Composition API提供了更灵活的方式来实现父子组件之间的传值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值