• 父组件与子组件的属性透传


    透传是vue中一种特性,官方的解释是:“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 propsemits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 classstyleid

    这句话解释过来就是一些不被prop定义的属性直接添加到子组件上的时候,子组件是可以获取到的,只不过获取的方式是通过方法获取的,下面我们展开说一下

    规则 

    父组件在使用子组件的时候,如何“透传属性和事件”给子组件呢?

    透传属性和事件并没有在子组件中用props和emits声明
    透传属性和事件最常见的如@click和class、id、style 
    当子组件只有一个根元素时,透传属性和事件会自动添加到该根元素上;如果根元素已有class或style属性,它会自动合并                       

    1、透传的属性只会直接传给单根节点的组件,如果子组件不是一个根节点,那么透传属性会直接失效,并且警告 

    举列:

    我有一个父组件App.vue

    1. <script>
    2. import ChildModule from "./components/ChildModule.vue" //导入ChildModule组件模板
    3. export default{
    4. data(){
    5. },
    6. components:{
    7. ChildModule:ChildModule //注册局部子组件ChildModule:也可以写成ChildModule:ChildModule
    8. }
    9. }
    10. script>

    案列1:透传的属性只会直接传给单根节点的组件

    子组件

    1. <template>
    2. <div>
    3. <button>提交button>
    4. div>
    5. template>

    查看F12元素可以体现

    案列2:如果子组件不是一个根节点,那么透传属性会直接失效,并且警告

    如果子组件存在两个根组件的情况下则透传会被失效

    1. <template>
    2. <div>
    3. <button>提交button>
    4. div>
    5. <div> div>
    6. template>

    查看F12元素可以体现

     案列3:子组件中用props接收的属性传透属性会直接失效

    1. <template>
    2. <div>
    3. <button>提交button>
    4. div>
    5. template>
    6. <script>
    7. export default{
    8. props:["class"]
    9. }
    10. script>

    查看F12元素可以体现

    案列4:透传过去的属性如果和子组件上的命名或属性重复了,会会以子组件本身的属性为主或追加

    透传过去的属性如果和子组件上的命名重复了,会以子组件本身的属性为主(id)
    透传过去的属性如果和子组件上的属性重复了,会直接添加到属性值的后面(style,class)

    1. <template>
    2. <div id="wowo" class="bbb">
    3. <button>提交button>
    4. div>
    5. template>

    查看F12元素可以体现

    2、透传事件

    案列

    父组件

    1. <template>
    2. <div>
    3. <ChildModule id="box" class="aaa" @click="handelClick()">ChildModule>
    4. div>
    5. template>
    6. <script>
    7. import ChildModule from "./components/ChildModule.vue" //导入ChildModule组件模板
    8. export default{
    9. data(){
    10. },
    11. components:{
    12. ChildModule:ChildModule //注册局部子组件ChildModule:也可以写成ChildModule:ChildModule
    13. },
    14. methods:{
    15. handelClick(){
    16. console.log("1111")
    17. }
    18. }
    19. }
    20. script>

     子组件

    1. <template>
    2. <div>
    3. <button>提交button>
    4. div>
    5. template>

    点击提交的时候,会发现打印出了: 22222,说明,父组件的handelClick事件也传递给了子组件的根节点。子组件根节点也就有了这个绑定事件。(其规则也是与透传属性是一样的)

    3、禁止透传

    父组件

    1. <template>
    2. <div>
    3. <ChildModule id="box" class="aaa" @click="handelClick()">ChildModule>
    4. div>
    5. template>
    6. <script>
    7. import ChildModule from "./components/ChildModule.vue" //导入ChildModule组件模板
    8. export default {
    9. data() {
    10. return {
    11. }
    12. },
    13. components: {
    14. ChildModule: ChildModule //注册局部子组件ChildModule:也可以写成ChildModule:ChildModule
    15. },
    16. methods: {
    17. handelClick() {
    18. console.log("1111")
    19. }
    20. }
    21. }
    22. script>

    添加 inheritAttrs:false可以禁止透传

    子组件

    1. <template>
    2. <div id="wowo" class="bbb" >
    3. <button>提交button>
    4. div>
    5. template>
    6. <script>
    7. export default{
    8. //禁止透传:在子组件中添加inheritAttrs为false,则父组件的属性和事件不会被透传到子组件
    9. //虽然指定了 inheritAttrs:false 但是子组件仍然可以通过 v-bind="$attrs"来得到负组件透传过来的属性和事件
    10. inheritAttrs:false,
    11. }
    12. script>

    虽然指定了 inheritAttrs:false 但是子组件仍然可以通过 v-bind="$attrs"来得到父组件透传过来的属性和事件

    子组件

    1. <template>
    2. <div id="wowo" class="bbb" >
    3. <button v-bind="$attrs">提交button>
    4. div>
    5. template>
    6. <script>
    7. export default{
    8. //禁止透传:在子组件中添加inheritAttrs为false,则父组件的属性和事件不会被透传到子组件
    9. //虽然指定了 inheritAttrs:false 但是子组件仍然可以通过 v-bind="$attrs"来得到负组件透传过来的属性和事件
    10. inheritAttrs:false,
    11. }
    12. script>

    查看F12元素可以体现(点击button可以发现button已经绑定了handelClick事件,打印了1111)

  • 相关阅读:
    Hugging Face学习
    比较研究测井预测:遗传算法与神经网络(Matlab代码实现)
    JAVA-递归构建树形结构 嵌套子节点返参给前端 && 获取某节点下所有叶子节点 && 获取某节点下叶节点(没有子节点的节点)
    超 Nice 的表格响应式布局小技巧
    Java-API简析_java.util.PropertyPermission类(基于 Latest JDK)(浅析源码)
    项目实战——实现注册与登录模块(结尾)
    Split Into Two Sets Codeforces 1702E
    51. N 皇后
    【yum包管理器常见用法】
    wireshark初步认识
  • 原文地址:https://blog.csdn.net/Fanbin168/article/details/133945639