vue的组件一些注意事项(props, 自定义事件)

本文深入探讨Vue.js中组件的全局注册方式,Props的多种类型检查及默认值设定,包括自定义验证函数的使用,以及如何正确处理自定义事件和原生事件的监听。

vue 的核心,就是一个一个的组件;

对于组件在使用上还是有一些需要的注意的东西的

  • 使用Vue.component(" ",{})这样注册的组件为全局注册组件;

  • Props的使用, 大小写的问题
    在这里插入图片描述
    对于传递一个对象的所有属性, 可以只使用v-bind=" "
    在这里插入图片描述

Props传值的几种方式:

Vue.component('my-component', {
  props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }
})
  • 对于自定义事件, 禁止使用驼峰命名;

使用中划线即可


  • 对于自定义事件, 如果需要将原生的事件绑定到组件上时,
    需要添加修饰符, .native 来进行监听
<think>我们参考引用[2]和引用[3]中的例子,特别是引用[3]中使用了`on`来绑定事件。 在Vue2的render函数中,我们使用`createElement`(通常简写为h)来创建虚拟节点。在创建节点时,可以通过数据对象的`on`属性来绑定事件(包括自定义事件)。 注意:对于原生事件(如click)可以直接在`on`中绑定,而自定义事件同样可以通过`on`来绑定,但是需要确保在子组件中通过`this.$emit('自定义事件名')`触发。 但是,这一个关键点:在父组件的render函数中,我们如何将自定义事件传递给子组件? 实际上,在父组件中,我们可以在创建子组件的VNode时,通过`on`属性传递事件监听器。这些监听器会被添加到子组件的实例上,当子组件通过`$emit`触发事件时,父组件就能监听到。 步骤: 1. 在父组件的render函数中,使用`createElement`创建子组件的VNode。 2. 在第二个参数(数据对象)中,设置`on`属性,该属性是一个对象,键为事件名(如'my-event'),值为事件处理函数。 注意:在Vue2中,自定义事件和原生事件在语法上都是通过`on`来绑定,但是Vue会区分组件上的事件和原生DOM事件。对于组件,`on`监听的是组件通过`$emit`触发的事件;而对于原生DOM元素,`on`监听的是原生事件。 示例: 假设有一个组件`MyButton`,它会在点击时触发一个名为`clicked`的自定义事件。在父组件的render函数中,我们可以这样绑定: ```javascript export default { render(h) { return h('div', [ h(MyButton, { on: { clicked: () => { console.log('自定义事件clicked被触发'); } } }) ]); } } ``` 另外,引用[3]中的例子展示了在子组件的render函数中如何绑定原生事件(click)到按钮上。注意,在子组件内部,我们绑定的是原生事件,所以使用`on`并指定事件名(如click)。而如果我们在子组件内部需要触发自定义事件给父组件,则需要在子组件内部使用`this.$emit`。 例如,在子组件button.vue中,我们可以在按钮的点击处理函数中触发自定义事件: ```javascript render(h) { return h('button', { on: { click: () => { // 在这触发一个自定义事件,比如叫做'custom-click' this.$emit('custom-click'); } } }, this.text); } ``` 然后在父组件中,就可以监听这个`custom-click`事件。 总结: 在父组件的render函数中,通过`on`属性绑定自定义事件(与在模板中使用`@custom-event`等效)。 在子组件的render函数中,可以通过`on`绑定原生事件(如click)或者组件事件(如果该节点是另一个组件),然后在事件处理函数中使用`this.$emit`触发自定义事件。 因此,针对用户的问题“如何在render函数中传递自定义事件”,我们主要是在父组件的render函数中,在创建子组件VNode的数据对象的`on`属性,以事件名为键,以处理函数为值进行绑定。 注意:在Vue2中,`.native`修饰符用于在组件上监听原生事件。在render函数中,如果要监听组件的原生事件,需要使用`nativeOn`属性。但是,这我们讨论的是自定义事件,所以不需要使用`.native`修饰符,直接使用`on`即可。 示例代码(父组件): ```javascript // 父组件 export default { render(h) { return h('div', [ // 子组件 h(ChildComponent, { // 普通属性 props: { someProp: 'value' }, // 事件监听 on: { 'custom-event': (data) => { console.log('收到自定义事件,数据:', data); } } }) ]); } } ``` 在子组件中,通过`this.$emit('custom-event', someData)`触发。 所以,用户的问题答案就是:在创建子组件VNode时,在数据对象的`on`属性中传递事件处理函数。 注意:如果用户是在子组件的render函数中绑定事件(比如绑定原生事件或者触发自定义事件),那么做法如引用[3]所示,在创建元素或组件时,在数据对象中设置`on`属性。 根据要求,生成相关问题: 1. 在Vue2的render函数中,如何绑定原生事件到DOM元素上? 2. Vue2中,如何在组件的render函数中触发自定义事件? 3. Vue2的render函数中,`nativeOn`和`on`有什么区别? 4. Vue2中,使用render函数时如何传递props事件监听器?</think>在 Vue 2 的 `render` 函数中传递自定义事件,需通过数据对象的 `on` 属性绑定事件监听器。以下是具体实现方法: ### 1. **父组件传递自定义事件** 在父组件的 `render` 函数中,使用 `createElement` 创建子组件时,在第二个参数的 `on` 对象中定义自定义事件监听器: ```javascript // 父组件 export default { render(createElement) { return createElement(ChildComponent, { // 传递 props props: { message: "Hello" }, // 绑定自定义事件 on: { 'custom-event': (data) => { console.log('收到子组件事件:', data); } } }); } } ``` ### 2. **子组件触发自定义事件** 在子组件的 `render` 函数中,通过 `this.$emit` 触发事件: ```javascript // 子组件 export default { render(createElement) { return createElement('button', { on: { click: () => { // 触发自定义事件并传递数据 this.$emit('custom-event', { value: 123 }); } } }, '点击触发事件'); } } ``` ### 3. **完整示例** ```javascript // 子组件 Child.vue export default { props: ['text'], render(h) { return h('button', { class: 'btn', on: { click: () => this.$emit('submit', { data: this.text }) } }, this.text); } } // 父组件 Parent.vue import Child from './Child.vue'; export default { render(h) { return h(Child, { props: { text: "提交" }, on: { submit: (payload) => alert(`收到数据: ${payload.data}`) } }); } } ``` ### 关键点说明: 1. **事件绑定位置** 父组件在 `createElement` 的第二个参数的 `on` 对象中定义事件监听器(例如 `on: { submit: handler }`)。 2. **事件触发方式** 子组件通过 `this.$emit('事件名', 数据)` 触发事件,与模板中 `$emit` 用法一致。 3. **与原生事件区别** - 自定义事件:使用 `on` 绑定(如 `on: { custom-event: handler }`) - 原生事件:在原生 DOM 元素上同样用 `on` 绑定(如 `on: { click: handler }`) 4. **注意事项** - 事件名需全小写或 kebab-case(如 `custom-event`) - 通过 `this.$emit` 的第二个参数传递数据 > 引用说明:Vue 2 的 `render` 函数通过 `on` 属性绑定自定义事件,其行为与模板中的 `v-on` 等效[^2][^3]。 --- ### 相关问题 1. Vue 2 的 `render` 函数中如何同时绑定多个事件(包括原生事件自定义事件)? 2. 在 `render` 函数中,如何区分组件自定义事件和原生 DOM 事件? 3. Vue 2 的 `render` 函数与模板语法在事件处理上有哪些主要差异? 4. 如何在 `render` 函数中实现事件修饰符(如 `.stop`, `.prevent`)的功能?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值