vue组件之间通信方式汇总

方式1:props和$emit

props和$emit仅仅限制在父子组件中使用

1.props:父组件向子组件传递数据

1.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age" msg="这是父组件的数据" :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      }
    };
  },
  components: {
    HelloWorld
  },
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props:["age", "person"],
  
}
</script>

1.2 过程分解

在这里插入图片描述

2.$emit:子组件向父组件传递数据

2.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person" @sendFather="reciveInfo"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">子组件向父组件传递数据的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("sendFather", this.info);
    }
  }
  
}
</script>

2.2 过程分解


在这里插入图片描述

3.子组件改变父组件传入的props值的方式

3.1.1借助.sync实现
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age.sync="age"  :person.sync="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">用于修改props里面值的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("update:age", 19);
      this.$emit("update:person", {name: "李四", address: "bbb"});
    }
  }
  
}
</script>

3.1.2 过程分解

在这里插入图片描述
在这里插入图片描述

3.2.1借助v-model实现,该方式在表单提交中较为常用
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <input v-model="age" placeholder="请输入年龄"/>
    <input v-model="person.name" placeholder="请输入名称"/>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("update:age", 19);
      this.$emit("update:person", {name: "李四", address: "bbb"});
    }
  }
  
}
</script>

3.2.2 过程分解

在这里插入图片描述
在这里插入图片描述

3.3.1对于非基本数据类型,只改变其中某个属性的值,可以直接实现
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">用于修改props里面值的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
  
}
</script>

3.3.2 过程分解

在这里插入图片描述
在这里插入图片描述

方式2:provide和inject

provide和inject在传递上比方式一更加的宽泛,当provide的组件上添加了,那么其后代都可以通过inject进行数据接收,不限制在父子组件之间

2.1代码展示

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : this.age,
      person: this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  inject:["age", "person"],
  components: {
    Hello1
  }
}
</script>


<template>
  <!-- 这是父组件 -->
<div >
  <div>这是孙组件,接收组件的数据传递,age的值是:{{this.age}}</div>
  <div>这是孙组件,接收组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
</div>
</template>

<script>

export default {
name: 'Hello1',
inject: ["age", "person"]

}
</script>
<style>

</style>

2.2过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3provide和inject响应式写法

上面的写法有个问题,如果你只是针对非基本数据类型的某个属性进行修改,修改后所有的地方都会进行改变,但是改变基本数据类型后改变整个对象后,组件本身会改变,但是其他不会随之改变,会造成数据不一致问题。

2.3.1 问题展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    <div>
      <button @click="change1">父组件中修改provide传递的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : this.age,
      person: this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>

在这里插入图片描述
在这里插入图片描述

2.3.2 解决方式
2.3.2.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    <div>
      <button @click="change1">父组件中修改provide传递的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : () => this.age,
      person: () => this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age()}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person().name}} --- {{person().address}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  inject:["age", "person"],
  components: {
    Hello1
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,接收组件的数据传递,age的值是:{{this.age()}}</div>
  <div>这是孙组件,接收组件的数据传递,person的值是:{{person().name}} --- {{person().address}}</div>
</div>
</template>

<script>

export default {
name: 'Hello1',
inject: ["age", "person"]

}
</script>
<style>

</style>
2.3.2.2 过程分解

在这里插入图片描述
在这里插入图片描述

2.3.2.3 使用备注

当我们后代组件想修改inject接收的数据时,如果是响应式的书写方式,那么无法提供修改方式(可以通过下面的$listeners去源头进行修改);如果是非响应式的书写,对于非基本数据类型来说,只是改变对象里面的某个属性是可以的,但是这种修改会很难知道是哪个组件对属性进行了修改,比较难以追踪,需要谨慎。其他的不建议修改,会造成数据不一致。

方式3:$parent和$children

这种方式很直接,将整个实例都获取去直接操作,$children是当前组件的直接子组件实例;$parent是当前组件的父组件实例,可以实现父组件及其后代组件上数据之间的传递。这种方式是获取组件本身的对象,与组件之间引用放置的顺序由很大关联,当改变组件引用的顺序时,需要同时修改获取原组件的下标,使用时需要谨慎考虑。

3.1代码展示

3.1.1 $children修改后代组件数据
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.$children[0].info = "修改子组件的数据";
      this.$children[0].$children[0].count = "修改孙组件的数据";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
 
</div>
</template>

<script>

export default {
name: 'Hello1',
data() {
  return {
    count : "孙组件数据"
  }
}
}
</script>
<style>

</style>
3.1.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.1 $parent修改先辈属性值
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.$children[0].info = "修改子组件的数据";
      this.$children[0].$children[0].count = "修改孙组件的数据";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
  <div>
    <button @click="change3">修改后先辈组件的值</button>
  </div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
    change3() {
      debugger;
      this.$parent.info ="修改直接父辈组件的值";
      this.$parent.$parent.age = 20;
    }
  },
}
</script>
<style>

</style>
3.2.2 过程分解

在这里插入图片描述

方式4:$ref和$refs

这种方式和方式三一样是获取组件实例本身去操作。在组件上添加一个ref属性,给与这个组件一个标志,通过该标志去获取组件本身的实例,相比较与方式三需要确定组件的引用顺序,该方式没有该苦恼,但是在给ref值的时候注意值不要重复。同时没有办法通过$ref去获取父类对象,这点是相比较于方式三的缺陷。

4.1代码展示

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      debugger;
      this.$refs.helloWorld.info = "修改子组件的值";
      this.$refs.helloWorld.$refs.hello1.count = "修改孙组件的值";
    }
  }
}
</script>
<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 ref ="hello1"/>
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
   
  },
}
</script>
<style>

</style>

4.2 过程分解

在这里插入图片描述
在这里插入图片描述

方式5:$attrs和$listeners

$attrs:包含了父作用域中没有被 prop 接收的所有属性(不包含class 和 style 属性)。这是其在使用是上的限制。在子组件中要通过这个去接收的条件。如果还要往下进行传递,需要v-bind来进行向下传递。自能是子类获取父类,同时只有定义出可以修改数据,中间传递组件无法修改值本身(可以通过下面的$listeners去源头进行修改)。

5.1 代码展示

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld" :age="this.age" :person="this.person" />
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>子组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
    <div>子组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
    <div>
      <button @click="change2">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 ref ="hello1" v-bind="this.$attrs"/>
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
      this.$attrs.age = 19;
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>孙组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
  <div>孙组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
   
  },
}
</script>
<style>

</style>

5.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 $listeners的使用

$listnters:包含所有父组件中的 v-on 事件监听器 (不包含 .native 修饰器的)。其作用与$emit的功能相似。但是其可以不限制与父子组件之间来使用。
注意与.native进行区分,native是用于将原生事件绑定到特定组件中使用的

5.3.1代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    
    <div>
      <Hello2 @click.native="handleTest3" />
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld" :age="this.age" :person="this.person" v-on="{handleTest1, handleTest2}" />
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
import Hello2 from '@/components/Hello2.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld,
    Hello2
  },
  methods: {
    handleTest1(info) {
     console.log("有参数的传递处理{}", info);
    },
    handleTest2() {
      console.log("无参数的参数处理");
    },
    handleTest3() {
      console.log("原生的处理方式");
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>子组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
    <div>子组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
    <div>
      <button @click="handle1">子类放在一个按钮来调用父类的handleTest1</button>
    </div>
    <div>
      <button  @click="handle3">原生的处理方式</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 v-bind="this.$attrs" v-on="$listeners"/>
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    handle1() {
      // 两种写法
      this.$listeners.handleTest1(this.info);
      this.$emit('handleTest1', this.info);
    },
    handle3() {
      // this.handleTest3();
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>孙组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
  <div>孙组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
  <button @click="handle2">子类放在一个按钮来调用父类的handleTest2</button>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
    handle2() {
      // 两种写法
      this.$listeners.handleTest2();
      this.$emit("handleTest2");
    }
  },
}
</script>
<style>

</style>
<!--  -->
<template>
<div >
  <button>用于测试native的使用</button>
</div>
</template>

<script>

export default {
name: 'Hello2',
components: {},
data() {
return {

}
},
computed: {},
watch: {},
methods: {

},
created() {

},
mounted() {

},
}
</script>
<style>

</style>
5.3.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方式6:Bus和vuex暂时不添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web Servlet

目录 1 简介2 创建Servlet项目并成功发布运行3 新加Servlet步骤4 Servlet项目练习5 Servlet运行原理6 操作 HTTP Request头的方法(部分方法示例)7 操作 HTTP Response头的方法(部分方法示例)8 两种重定向(页面跳转)方法9 Cookie9.1 Cookie工作原理9.2 cookie构成9.3 Servlet 操…

LeetCode 1976.到达目的地的方案数:单源最短路的Dijkstra算法

【LetMeFly】1976.到达目的地的方案数&#xff1a;单源最短路的Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/ 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff…

202441读书笔记|《笠翁对韵》—— 金菡萏,玉芙蓉,酒晕微酡琼杏颊,香尘浅印玉莲双

202441读书笔记|《笠翁对韵》——金菡萏&#xff0c;玉芙蓉&#xff0c;酒晕微酡琼杏颊&#xff0c;香尘浅印玉莲双 《作家榜名著&#xff1a;笠翁对韵》作者李渔&#xff0c;霍俊明。是所有词句都有注音的一本书&#xff0c;轻松学不认识的字&#xff0c;非常朗朗上口的对偶词…

2024年如何批量下载知乎回答和知乎文章导出pdf?

如何批量下载知乎回答和知乎文章导出pdf&#xff1f;用scraper浏览器扩展 2024 年开发的第一个脚本神器 下载的所有回答html内容&#xff0c;文件名为回答日期加标题。 接着批量将html转换pdf&#xff0c;效果如图&#xff1a; 再将所有pdf合成一个pdf文件&#xff1a; 每个回…

VUE Element例子学习

参考:【前端】VueElement UI案例&#xff1a;通用后台管理系统-项目总结_vue elementui 管理系统-CSDN博客 之前参考的el-admin-web太复杂了&#xff0c;不是纯净的demo. 所以找了一圈资料&#xff0c;找到了这个博客&#xff0c;很合适&#xff0c;有例子的代码&#xff0c;…

vue中性能优化

目录 1. 编码优化 2. 源码优化 3. 打包优化 4. 利用 Vue Devtools 总结 Vue.js 作为一个强大的前端框架&#xff0c;提供了丰富的功能和工具来帮助开发者构建高效的 Web 应用。然而&#xff0c;在开发过程中&#xff0c;性能优化仍然是一个需要关注的问题。以下是对 Vue.j…

Solidity攻击合约:重入攻击与危害分析

以太坊智能合约开发中&#xff0c;重入攻击是一种常见的安全漏洞。这种攻击通常发生在合约的递归调用中&#xff0c;攻击者通过构造恶意交易&#xff0c;使得原本合约在执行过程中不断调用自身或其他合约&#xff0c;从而耗尽合约的Gas&#xff08;交易费用&#xff09;&#x…

数据结构与算法----复习Part 13 (单模式串匹配算法)

本系列是算法通关手册LeeCode的学习笔记 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 目录 一&#xff0c;朴素匹配算法&#xff08;Brute Force&#xff09; 二&#xff0c;Rabin Karp算法 三&#xff…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十二)-Multi-RTT定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

C语言字符串型常量

在C语言中&#xff0c;字符串型常量是由一系列字符组成的常量。字符串常量在C中以双引号&#xff08;"&#xff09;括起来&#xff0c;例如&#xff1a;“Hello, World!”。字符串常量在C中是不可变的&#xff0c;也就是说&#xff0c;一旦定义&#xff0c;就不能修改其内…

Python 一步一步教你用pyglet仿制鸿蒙系统里的时钟

目录 鸿蒙时钟 1. 绘制圆盘 2. 创建表类 3. 绘制刻度 4. 刻度数值 5. 添加指针 6. 转动指针 7. 联动时间 8. 时钟走动 鸿蒙时钟 本篇将用python pyglet库复刻华为手机鸿蒙系统闹钟程序的时钟&#xff0c;先在上图中抓取出时分秒针及刻度、表盘的颜色RGB值&#xff1a…

读书笔记之《理解和改变世界》:从信息知识智能的本质看AI

《理解和改变世界: 从信息到知识与智能》作者:是(法) 约瑟夫希发基思&#xff0c; 原作名: Understanding and Changing the World: From Information to Knowledge and Intelligence&#xff0c;2023年出版。 约瑟夫希发基思&#xff08;Joseph Sifakis&#xff09;&#xff…

力扣199. 二叉树的右视图(DFS,BFS)

Problem: 199. 二叉树的右视图 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 无论是DFS还是BFS我们都要思考到达二叉树的每一层&#xff08;或者每一层中的每一个节点&#xff09;时&#xff0c;我们都该如何按题目要求做出对应得处理!!!在本体中我们主要是&#x…

leetcode 热题 100_缺失的第一个正数

题解一&#xff1a; 正负模拟哈希&#xff1a;偏技巧类的题目&#xff0c;在无法使用额外空间的情况下&#xff0c;只能在原数组中做出类似哈希表的模拟。除去数值&#xff0c;我们还可以用正负来表示下标值的出现情况。首先&#xff0c;数组中存在正负数和0&#xff0c;而负数…

Ubuntu下使用DAPLink(OpenOCD)

目录 1. 下载OpenOCD源代码 2. 编译代码 2.1 运行bootstrap 2.2 安装关联库 2.3 运行./configure 2.4 运行make 2.5 运行sudo make install 3. 烧录程序 3.1 挂起MCU 3.2 写入镜像 3.3 校验镜像 通过OpenOCD实现&#xff0c;在Ubuntu18 64bit下验证。 1. 下载OpenOC…

初识C++编程语言(万字详解)

目录 ::域作用限定符 命名空间域(namespace)&#xff1a; 流插入和流提取&#xff08;C的输入输出&#xff09; 缺省参数&#xff1a; 函数重载&#xff1a; 引用&#xff1a; 内联函数&#xff1a; auto关键字&#xff1a; 1、类型思考&#xff1a; 2、auto介绍&am…

HarmonyOS NEXT应用开发案例——列表编辑实现

介绍 本示例介绍用过使用ListItem组件属性swipeAction实现列表左滑编辑效果的功能。 该场景多用于待办事项管理、文件管理、备忘录的记录管理等。 效果图预览 使用说明&#xff1a; 点击添加按钮&#xff0c;选择需要添加的待办事项。长按待办事项&#xff0c;点击删除后&am…

java网络编程 01 IP,端口,域名,TCP/UDP, InetAddress

01.IP 要想让网络中的计算机能够互相通信&#xff0c;必须为计算机指定一个标识号&#xff0c;通过这个标识号来指定要接受数据的计算机和识别发送的计算机&#xff0c;而IP地址就是这个标识号&#xff0c;也就是设备的标识。 ip地址组成&#xff1a; ip地址分类&#xff1a;…

HCIP --- BGP 综合实验

实验拓扑图&#xff1a; 实验要求&#xff1a; 1.AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24该地址不能 在任何协议中宣告 AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以互相通讯. 2.整个…

基于Netty框架的位置服务平台的设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 开发环境及开发工具 3 1.2 相关知识简介 3 1.3 本章小结 4 2 系统分析 5 2.1 设计背景 5 2.2 系统需求分析 5 2.3 市场分析 5 2.4 论文的概要内容 6 2.5 本章小结 6 3 系统设计 7 3.1 系统总体设计 7 3.2 系统结构设计 8 …