suchen

Heim  >  Fragen und Antworten  >  Hauptteil

TypeError in der Renderfunktion von Vue 3: Die Eigenschaft von undefiniert kann nicht gelesen werden (lesen Sie „iconType“).

Ich migriere meine Vue-Anwendung von Vue 2 auf Vue 3. Dieser Fehler tritt auf, wenn die Option (function: true) aus einer Funktionskomponente entfernt wird. In meiner Vue 2-Anwendung verwende ich Renderfunktionen, indem ich Requisiten, Daten und Listener als Parameter übergebe. Nun habe ich die offizielle Dokumentation gelesen, verstehe aber nicht, wie man Parameter übergibt? Dies ist meine Vue 2-Renderfunktion.

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));
},

Wie migriere ich es zur Vue 3-Rendering-Funktion oder muss ich die Einstellungsfunktion verwenden? Wenn ich die Setup-Funktion verwende, wie kann ich dann Daten und Listener als Parameter übergeben?

P粉585541766P粉585541766305 Tage vor406

Antworte allen(1)Ich werde antworten

  • 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));
      },
    });
    
    
    

    Antwort
    0
  • StornierenAntwort