Vue $listener 和 .native 修饰符 示例详解

vm.$listener 包含了父组件中(除了 .native 修饰器以外的)事件监听器。

.native 修饰器是将组件看成一个普通的 HTML 标签,并且在父组件处给子组件绑定一个原生事件。

当内部组件不具备外部绑定的一些 DOM 事件,而外部组件具备相应的 DOM 事件时,在内部组件可以通过 v-on="listener" 将外部组件绑定的事件和事件函数传入内部组件。

示例如下:

	// 父组件作用域中
	// js
	import TodoTextInput from '@/components/TodoTextInput.vue'
	// html
    <TodoTextInput 
      v-model="newTodoText"
      @keydown.enter="addTodos">
    </TodoTextInput>
    // 上下两种组件都能实现有效的外部绑定事件
    <TodoInputNative
    v-model="newTodoText"
    @keydown.enter.native="addTodos">
    </TodoInputNative>

	// TodoTextInput 子组件作用域中    ------ this.$listeners 传入绑定事件
	// html
	<div>
    	<input v-on="listeners" />
		// 添加一个 input 做对比
		<input @input="putTodoText" />
  	</div>
  	// js
  	computed: {
		listeners() {
        	console.log(this.$listeners);  // 控制台打印出来就可以很清楚的看到
        	return {
          	...this.$listeners,  
          	input: event => this.$emit('input', event.target.value)  // 子组件自身绑定的 input 事件监听器
        	}
      	}
	},
	methods: {
		putTodoText(e) {
			this.$emit('input', e.target.value)  // 第二个 input 能够提交 value 但是没有办法 addTodos
		}
	}

	// TodoInputNative 子组件作用域中    ------ 普通组件外部通过 .native 绑定事件
	// html
	<div>
    	<input @input="putInput" />
  	</div>
  	// js
  	methods: {
      putInput(e) {
        this.$emit('input', e.target.value)
      }
    }

我们在父组件给 TodoTextInput 绑定了回车键按下的事件监听器,通过 this.$listener 将父组件绑定的事件和事件函数绑定到子组件上。如果使用 TodoTextInput 第二种 input 的话,我们无法触发父组件绑定的这个 回车键按下的 事件。

同样也可以使用 .native 修饰符把组件看成是一个普通的 html 标签,在父组件给其绑定原声事件,也能实现内部组件监听外部组件绑定的事件的效果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值