搜尋

首頁  >  問答  >  主體

在Vue 3的渲染函數中出現TypeError:無法讀取未定義的屬性(讀取'iconType')

我正在將我的 vue 應用程式從 vue 2 遷移到 vue 3。從功能元件中刪除 (function: true) 選項時出現此錯誤。在我的 vue 2 應用程式中,我透過傳遞 props、資料和偵聽器作為參數來使用渲染函數。現在,我已經閱讀了官方文檔,但無法理解如何傳遞參數?這是我的 vue 2 渲染函數。

render(h, {props, data,listeners, children = []}) {
    let moreIcons = {};
    let cType = props.iconType || props.type;
    if(!cType) {
        cType = props.picto ? 'picto' : 'line'; 
    }
    if (cType === 'picto') {
        moreIcons = moreIconsPicto;
    } else if (cType === 'line') {
        moreIcons = moreIconsLine;
    }
    let cColor ='';
    if (props.primary||props.prim) { cColor= 'primary'; }
    else if (props.point||props.pnt) { cColor= 'point'; }
    else if (props.default||props.dft) { cColor= 'default'; }
    else if (!!props.color||!!props.col) { cColor= props.color||props.col; }

    let cSize = '' ;
    if(props.large || props.lg) {cSize= 'large';}
    else if(props.medium || props.md) {cSize= 'medium';}
    else if(props.small || props.sm) {cSize= 'small';}
    else if(props.xsmall || props.xs) {cSize= 'xsmall';}
    else if(props.full) {cSize= 'full';}

    let customSize = props.iconSize || props.size;
    if(parseInt(customSize, 10)) {customSize = customSize + 'px';}

    let iconName = props.icon || children.default().text;
    let options = {
        class: [
            'ur-icon',
            'ur-icon--'+cType,
            cColor && 'ur-icon--'+cColor,
            cSize &&'ur-icon--'+cSize,
            props.spacing && 'ur-icon--spacing'
        ],
        style: {
            fontSize: customSize
        },
        on: listeners
    };
    if(data.class) {
        if(Array.isArray(data.class)) {
            options.class = options.class.concat(data.class);
        }
        if(typeof data.class === 'string' || typeof data.class === 'object') {
            options.class.push(data.class);
        }
    }
    if(data.style) {
        options.style = Object.assign(data.style, options.style);
    }
    let child = [];
    if (moreIcons[iconName] !== undefined) {
        options.class.push('more-icon__'+iconName);
        let svg = moreIcons[iconName];
        if(!props.focusable) {svg = svg.replace('<svg ','<svg focusable="false" ');}
        options.domProps={innerHTML:svg};
    } else {
        // 1. icon class
        options.class.push('fa-'+iconName);
        // 2. type class
        if     ( props.brand )   { options.class.push('fab'); }
        else if( props.fab)      { options.class.push('fab'); }
        else if( props.regular ) { options.class.push('far'); }/* pro only */
        else if( props.far )     { options.class.push('far'); }/* pro only */
        else if( props.light)    { options.class.push('fal'); }/* pro only */
        else if( props.fal)      { options.class.push('fal'); }/* pro only */
        else if( props.old)      { options.class.push('fa'); }/* font-awesome 4.0*/
        else if( props.fa)       { options.class.push('fa'); }/* font-awesome 4.0*/
        else { options.class.push("fas"); }
    }
    return h('i',Object.assign(data, options));
},

如何將其遷移到vue 3渲染功能或需要使用設定功能?如果我使用設定函數,那麼如何將資料和偵聽器作為參數傳遞?

P粉585541766P粉585541766272 天前382

全部回覆(1)我來回復

  • P粉792673958

    P粉7926739582024-02-27 00:36:26

    h 函數應該從 vue 導入,而不是用作參數,我建議使用帶有設定掛鉤的渲染函數,如下所示:

    import { defineComponent, h } from "vue";
    
    export default defineComponent({
      props: {
        …
      },
      setup(props, { slots }) {
        let moreIcons = {};
        let cType = props.iconType || props.type;
         …
         ....
        return () => h('i',Object.assign(data, options));
      },
    });
    
    
    

    回覆
    0
  • 取消回覆