Vue 组件定义方式的区别

javascript 复制代码
原始写法(函数式组件)
在 Vue 3 中,​​render 是保留属性名​​,与组件的渲染逻辑直接相关。即使未显式声明:

如果父组件传递了 render 属性,Vue 会优先将其注入到 props 中(类似 key、ref 等内置属性)。
​​这是 Vue 的内部优化​​,确保渲染函数能直接访问。
import { h } from 'vue'

const Render = (props, ctx) => {
  return props.render ? h(props.render, ctx.attrs, ctx.slots) : ''
}

传递props
import { h, defineProps } from 'vue'

const RenderComponent = (props) => {
  const { render, ...rest } = defineProps({
    render: {
      type: Function,
      required: true
    },
    scope: {
      type: Object,
      default: () => ({})
    }
  })
  
  return render ? h(render, rest) : null
}

export default RenderComponent
javascript 复制代码
export default Render
新写法(使用 defineComponent)
import { defineComponent } from 'vue'

export default defineComponent({
  props: ['render'],
  setup(props, ctx) {
    return () => props.render ? h(props.render, ctx.attrs, ctx.slots) : ''
  }
})

主要区别

  1. 组件类型
    原始写法:函数式组件(Functional Component)
    无状态(无 this)
    无实例生命周期
    性能略高(Vue 3 中差异变小)
    新写法:标准组件(使用 defineComponent)
    有组件实例
    完整的生命周期
    可以使用 Composition API 的全部功能
  2. Props 声明
    原始写法:隐式接收 props
    所有属性都通过 props 参数接收
    没有显式的 props 验证
    新写法:显式声明 props
    通过 props 选项明确声明
    可以添加类型验证和默认值
  3. 渲染机制
    原始写法:直接返回渲染结果
    函数体本身就是渲染函数
    新写法:通过 setup 返回渲染函数
    setup 返回一个函数(工厂函数)
    每次重新渲染都会调用这个工厂函数
  4. 上下文访问
    原始写法:通过第二个参数 ctx 访问
    包含 attrs、slots 和 emit
    新写法:通过 setup 的第二个参数访问
    同样包含 attrs、slots 和 emit
    但组织方式更符合 Composition API 风格
  5. TypeScript 支持
    原始写法:类型推断有限
    新写法:更好的 TypeScript 集成
    可以明确指定 props 类型
    更好的编辑器支持
相关推荐
xiaoqi9221 分钟前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...14 分钟前
Tesseract.js OCR 中文识别
前端·react.js·ocr
qq_1777673724 分钟前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
2603_9494621030 分钟前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n36 分钟前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon1 小时前
理解vue中的ref
前端·javascript·vue.js
jin1233222 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_920931702 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
落霞的思绪2 小时前
配置React和React-dom为CDN引入
前端·react.js·前端框架
Hacker_Z&Q2 小时前
CSS 笔记2 (属性)
前端·css·笔记