账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    怎么理解vue中$listeners属性?官网的例子不是很明白,求指教?
    41
    0

    1.官网一开始举例在一个组件的根元素上监听一个原生事件可以用v-on的.native修饰符,例如
    <base-input v-on:focus.native="onFocus"></base-input>
    2.但是<base-input>内部如果做了重构,根元素实际上是个<label>元素,

    <label>
      {{ label }}
      <input
        v-bind="$attrs"
        v-bind:value="value"
        v-on:input="$emit('input', $event.target.value)"
      >
    </label>
    

    这时父级的.native监听器将失效,所以vue提供了$listeners属性
    3.接下来的举例不是很明白,例子如下:

    Vue.component('base-input', {
      inheritAttrs: false,
      props: ['label', 'value'],
      computed: {
        inputListeners: function () {
          var vm = this
          // `Object.assign` 将所有的对象合并为一个新对象
          return Object.assign({},
            // 我们从父级添加所有的监听器
            this.$listeners,
            // 然后我们添加自定义监听器,
            // 或覆写一些监听器的行为
            {
              // 这里确保组件配合 `v-model` 的工作
              input: function (event) {
                vm.$emit('input', event.target.value)
              }
            }
          )
        }
      },
      template: `
        <label>
          {{ label }}
          <input
            v-bind="$attrs"
            v-bind:value="value"
            v-on="inputListeners"
          >
        </label>
      `
    })
    

    官网原话,现在 <base-input> 组件是一个完全透明的包裹器了,也就是说它可以完全像一个普通的 <input> 元素一样使用了:所有跟它相同的特性和监听器的都可以工作。
    4.这个例子写的很清楚,但是不懂什么意思,求大佬解释解释。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 君子之交,太淡 普通会员 1楼

      在 Vue 中,$listeners 是一个对象,用于存储 Vue 组件在特定事件发生时执行的回调函数。这个属性的值是一个数组,其中每个元素都是一个数组,表示每个触发事件的组件需要执行的回调函数。

      以下是一个简单的例子:

      ```javascript // 定义一个 Vue 组件 class MyComponent extends Vue { // 定义一个属性 $listeners,存储触发事件的组件的回调函数 @click(function() { console.log('我被点击了!'); }) }

      // 创建一个新的 Vue 组件实例,并传入 $listeners 属性 new MyComponent({ $listeners: ['handleClick'] });

      // 在组件的 created 生命周期钩子中,调用触发事件的组件的回调函数 new MyComponent().created(function() { console.log('组件创建完成'); }); ```

      在这个例子中,我们定义了一个名为 MyComponent 的 Vue 组件,并在其中添加了一个名为 $listeners 的属性。当我们点击组件的 handleClick 回调函数时,这些回调函数会被自动调用。

      需要注意的是,Vue 的 @click 钩子是绑定在元素上的,而不仅仅是组件的实例。这意味着,如果你在组件的任何地方点击事件处理器,都会触发 $listeners 的回调函数。

      另外,如果你想在组件实例触发事件之前调用这些回调函数,可以使用 beforeCreate 或者 beforeMount 钩子。例如:

      javascript new MyComponent().beforeCreate(function() { console.log('组件创建前'); });

      或者

      javascript new MyComponent().beforeMount(function() { console.log('组件创建后'); });

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部