【问题标题】:TypeError: Cannot read properties of undefined (reading 'iconType') in render function - vue 3TypeError:无法在渲染函数中读取未定义的属性(读取“iconType”)-vue 3
【发布时间】:2022-01-14 11:18:47
【问题描述】:

我正在将我的 vue 应用程序从 vue 2 迁移到 vue 3。从功能组件中删除 (functional: true) 选项时出现此错误。在我的 vue 2 应用程序中,我通过传递道具、数据和侦听器作为参数来使用渲染函数。现在,我已经浏览了官方文档,但无法理解如何传递参数?这是我的 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 渲染功能或需要使用设置功能?如果我使用 setup 函数,那么如何将数据和侦听器作为参数传递?

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    h 函数应该从vue 导入而不用作参数,我建议使用带有 setup 钩子的渲染函数,如下所示:

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

    【讨论】:

    • 感谢您的回复。但是,如何在设置中传递该数据参数?
    • 您应该使用组合 api 属性(如 refreactive 而不使用 data 选项)在设置挂钩内定义数据
    • 其实我已经尝试过组合api的设置功能。但是,无法弄清楚该函数中的仍然 ref 和响应式。您能否用 ref 详细说明您的上述答案?这对我会有帮助。
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2021-12-12
    • 2021-02-17
    • 2020-04-08
    • 2022-01-10
    • 2022-06-28
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多