You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Web Component集成Vuetify后Props无法传递问题求助

问题原因

重写defineCustomElement时,未完成原生Web Component属性与内部Vue组件Props的双向同步:

  1. 原生自定义元素的属性变更不会自动触发内部Vue组件的Props更新,必须手动监听属性变化并同步到组件内部。
  2. 单独声明Props后,未建立从自定义元素属性到内部组件Props的映射逻辑,导致外部传入的属性无法传递到Vue组件中。
解决方法:修改重写的defineCustomElement方法

在重写的方法中添加Props同步逻辑,确保外部属性能正确传递到内部Vue组件,代码示例如下:

import { defineCustomElement as vueDefineCustomElement, h, useAttrs, watch, toRefs } from 'vue'
import { createVuetify } from 'vuetify'
import 'vuetify/styles'

// 初始化Vuetify实例
const vuetify = createVuetify()

export function defineCustomElement(component) {
  // 提取Vue组件的Props定义
  const componentProps = component.props || {}

  return vueDefineCustomElement({
    // 声明自定义元素需监听的属性(与Vue组件Props一一对应)
    props: Object.keys(componentProps),
    setup(props) {
      const attrs = useAttrs()
      
      // 构建同步到内部组件的Props集合
      const syncProps = {}
      Object.keys(componentProps).forEach(key => {
        // 优先使用Vue响应式props, fallback到原生属性
        syncProps[key] = props[key] ?? attrs[key]
        
        // 监听原生属性变化,同步到Vue组件Props
        watch(() => attrs[key], (newVal) => {
          props[key] = newVal
        })
      })

      return () => h(component, {
        ...syncProps,
        vuetify // 注入Vuetify实例
      })
    }
  })
}
额外注意事项
  • 确保Vue组件的Props定义规范,示例如下:
    // 你的Vuetify组件简化版
    export default {
      props: {
        checkProp: {
          type: String,
          default: ''
        }
      },
      // 组件逻辑...
    }
    
  • 在index.html中传递属性时,推荐使用kebab-case格式(与Vue组件的camelCase Props自动映射),写法为:<custom-vuetify-element check-prop="foo"></custom-vuetify-element>。
  • 若需传递复杂类型(对象、数组),不能直接通过HTML属性设置,需通过JavaScript操作:
    const elem = document.querySelector('custom-vuetify-element')
    elem.checkProp = { key: 'complex-value' }
    

内容的提问来源于stack exchange,提问作者orb-livan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:21:05