【Vue】父子组件传值

使用组件的意义就在于减少代码量,这里以修改列表为例,演示父子组件传值。

效果:

子组件代码:

<template>
  <div style="margin-left: 20px">
    |----edit----|  name:
    <input v-model="value.name">
    age:
    <input v-model="value.age">
    <button @click="save">save</button>
  </div>
</template>

<script>
    export default {
        name: "Vue04-a",
        data() {
            return {
                value: {
                    id:undefined,
                    name: '',
                    age: undefined,
                }

            }
        },
        methods: {
            save() {
                this.$emit('setItem', this.value)
            }
        },
        props: ['item'],//定义外部使用的属性,对本身来说都是只读的,修改后报错,同时也无法回馈到父组件
        mounted() {
            this.value.id=this.item.id;
            this.value.name=this.item.name;
            this.value.age=this.item.age;
        }
    }
</script>

<style scoped>

</style>

父组件代码:

<template>
<div>
 <ul>
   <li v-for="(item,index) in arr" :key="index">
     name:  {{item.name}}   ,    age: {{item.age}} <liEditer  :item="item" @setItem="setItem"></liEditer>
   </li>
 </ul>

</div>
</template>

<script>
  import liEditer from './Vue04-a'
    export default {
        name: "Vue04",
        components:{
            liEditer:liEditer
        },
        data(){
            return{
                arr:[
                    {id:1,name:'c',age:20},
                    {id:2,name:'e',age:21},
                    {id:3,name:'g',age:22}
                ]
            }
        },
        methods:{
            setItem(value){
                var item= this.arr.find(x=>x.id==value.id);
                item.name=value.name;
                item.age=value.age;
            }
        }
    }
</script>

<style scoped>
li{
  display: flex;
}
</style>

父向子传值:  父v-bind=>子props定义  接受即可,props定义的属性,不能在子组件进行修改,会引发报错,同时父组件对应的值也不会随之改变;

子向父传值:这有点像C# 里面的 窗体委托传值,使用方法把数据带回来。

父组件也可以用过ref获取子组件的值

使用ref对子组件进行标记,就可直接访问组件里面的数据

<template>
<div>
 <ul>
   <li v-for="(item,index) in arr" :key="index">
     name:  {{item.name}}   ,    age: {{item.age}}
<!--     <liEditer  :item="item" @setItem="setItem"></liEditer>-->
     <liEditer :ref="'li'+index" :item="item" @setItem="setItem"></liEditer>
   </li>
 </ul>

</div>
</template>

<script>
  import liEditer from './Vue04-a'
    export default {
        name: "Vue04",
        components:{
            liEditer:liEditer
        },
        data(){
            return{
                arr:[
                    {id:1,name:'c',age:20},
                    {id:2,name:'e',age:21},
                    {id:3,name:'g',age:22}
                ]
            }
        },
        methods:{
            setItem(value){
                // var item= this.arr.find(x=>x.id==value.id);
                // item.name=value.name;
                // item.age=value.age;
                console.log(this.$refs.li1)
            }
        }
    }
</script>

<style scoped>
li{
  display: flex;
}
</style>

发布了47 篇原创文章 · 获赞 4 · 访问量 7485

猜你喜欢

转载自blog.csdn.net/weixin_39370093/article/details/99679579
今日推荐