Vue中Non-props属性是什么

先看一个通过props接收父组件参数的栗子:

  const app = Vue.createApp({
    template: `
      <div>
        <counter msg="hello" />
      </div>
    `
  });

  app.component('counter', {
    props:['msg'],
    template: `
      <div>Counter</div>
    `
  });

  const vm = app.mount('#root');

再看一下如果不用props接受时的代码:

  const app = Vue.createApp({
    template: `
      <div>
        <counter msg="hello" />
      </div>
    `
  });

  app.component('counter', {
    template: `
      <div>Counter</div>
    `
  });

  const vm = app.mount('#root');

比较一下两者的dom结构:
在这里插入图片描述
在这里插入图片描述
两张图分别是用props接收和未用props接收的效果图,两者对比可见:当父组件传过去的属性值如果子组件不接收时传过来的属性会放在最近的dom标签下.

inheritAttrs:false可以不在子组件中显示这个属性.

  const app = Vue.createApp({
    template: `
      <div>
        <counter msg="hello" />
      </div>
    `
  });

  app.component('counter', {
    inheritAttrs:false,
    template: `
      <div>Counter</div>
    `
  });

  const vm = app.mount('#root');

inheritAttrs:false的意思是不继承父组件的属性.

还有就是当有多个根节点时Non-prpos就不会生效了:

  const app = Vue.createApp({
    template: `
      <div>
        <counter msg="hello" />
      </div>
    `
  });

  app.component('counter', {
    // inheritAttrs:false,
    template: `
      <div>Counter</div>
      <div>Counter</div>
      <div>Counter</div>
    `
  });

  const vm = app.mount('#root');

这时dom标签下就不会有msg="hello"这个属性了.
在这里插入图片描述
但是如果我们想让某个div标签下有msg="hello"该怎么办呢?
可以添加v-bind="$attrs"使dom标签下有msg=“hello”:
在这里插入图片描述
v-bind="$attrs"的意思是把父组件传过来的所有Non-props全部放到那个标签中去.

也可以单一的去获取父组件传过来的Non-props的某一个属性值:

  const app = Vue.createApp({
    template: `
      <div>
        <counter msg="hello" msg1="world" />
      </div>
    `
  });

  app.component('counter', {
    // inheritAttrs:false,
    template: `
      <div v-bind:msg="$attrs.msg">Counter</div>
      <div v-bind="$attrs">Counter</div>
      <div>Counter</div>
    `
  });

  const vm = app.mount('#root');

在这里插入图片描述

在Vue中Non-props属性不仅可以用在v-bind用在标签上还可以用在生命周期函数里或者JS的表达式里:

  const app = Vue.createApp({
    template: `
      <div>
        <counter msg="hello" msg1="hello1" />
      </div>
    `
  });

  app.component('counter', {
    // inheritAttrs: false,
    mounted() {
      console.log(this.$attrs.msg);
    },
    template: `
      <div :msg="$attrs.msg">Counter</div>
      <div v-bind="$attrs">Counter</div>
      <div :msg1="$attrs.msg1">Counter</div>
    `
  });

  const vm = app.mount('#root');
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值