首页 文章

Redux表单 - 渲染以下自定义组件时出错?不知道为什么?

提问于
浏览
0

我试图使用redux-form呈现以下自定义字段组件,我也将自定义道具传递给字段组件,但它不断给我一个错误,如下所示:

invariant.js:42未捕获错误:对象无效作为React子对象(找到:具有键的对象) . 如果您要渲染子集合,请使用数组 . 在ConnectField中由ConnectedField创建(由Connect(ConnectedField)创建)由Connect(ConnectedField)创建(由Field创建)在Field(由LoginForm创建)in div(由LoginForm创建)in Login(由LoginForm创建)在LoginForm中(由Form(LoginForm)创建)由Connect(Form(LoginForm))创建的Form(LoginForm)(由Connect(Form(LoginForm)创建))(由ReduxForm创建)在ReduxForm(由Login创建)中div(由Login创建) )在div中(由登录创建)在div中(由登录创建)在div中(由登录创建)在div中(由登录创建)在登录中创建的部分(由登录创建)(由Connect(登录)创建)在Connect中(登录) )(由Route创建)在路由器中的路由器中的路由器(由ConnectedRouter创建)在ConnectedRouter中的提供者处于invariant(invariant.js:42),在throwOnInvalidObjectType(react-dom.development.js:6748)处于reconcileChildFibers(react-dom . development.js:7659)在reconcileChildren的reconcileChildrenAtExpirationTime(react-dom.development.js:7756)(react-dom.development.js) :7747)在finishClassComponent(react-dom.development.js:7881)的updateClassComponent(react-dom.development.js:7850)at beginWork(react-dom.development.js:8225)at performUnitOfWork(react-dom.development) .js:10224)at workLoop(react-dom.development.js:10288)VM250629:20组件中出现上述错误:在ConnectedField中的InputField(由ConnectedField创建)(由Connect(ConnectedField)创建)在Connect(ConnectedField)中)(由Field创建)由Field(由LoginForm创建)在div(由LoginForm创建)的形式(由LoginForm创建)在LoginForm中(由Form(LoginForm)创建)在Form(LoginForm)中(由Connect(Form)创建) )))在div中的div(由Login创建)(由Login创建)div(由Login创建)div(由Login创建)div(由Login创建)div(由Login创建)中的Connect(Form(LoginForm))(由ReduxForm创建) )在登录中创建的div(由Login创建)(由Connect(登录)创建)在Connect(登录)中创建的Connect(登录)(由Route创建)在路由器div中提供者中的ConnectedRouter中的ConnectedRouter)考虑向树添加错误边界以自定义错误处理行为 .

import React, { Component } from 'react';
import PropTypes from 'prop-types';

class InputField extends Component {
    render() {
        const { input, label, id, minlength, maxlength, required, meta: { touched, error } } = this.props;

        console.log('InputField - render', input, label, id, minlength, maxlength, required, touched, error);

        let renderValidation = function() {
            if (touched && !error) {
                return <i className="fa fa-check tm-form-valid"></i>;
            } else if (touched && error) {
                return <i className="fa fa-exclamation-triangle tm-form-invalid tooltip tooltip-effect tooltip-item"><span className="tooltip-content clearfix"><span className="tooltip-text">{error}</span></span></i>;
            }
        }

        return (
            <span className="input input--isao">
                <input {...input}
                    className="input__field input__field--isao"
                    spellCheck="false"
                    label={label}
                    id={id}
                    minLength={minlength}
                    maxLength={maxlength}
                    required={required} />
            </span>,

            <label className="input__label input__label--isao"
                htmlFor={id}
                data-content={label}>
                <span className="input__label-content input__label-content--isao">
                    {label}
                </span>
            </label>,

            {renderValidation}
        );
    }
}

InputField.propTypes = {
    input: PropTypes.object.isRequired,
    label: PropTypes.string.isRequired,
    id: PropTypes.string.isRequired,
    minlength: PropTypes.string.isRequired,
    maxlength: PropTypes.string.isRequired,
    required: PropTypes.bool.isRequired,
    meta: PropTypes.object.isRequired,
    touched: PropTypes.bool,
    error: PropTypes.string
};

export default InputField;

2 回答

  • 0
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    
    class InputField extends Component {
        render() {
            const { input, label, id, minlength, maxlength, required, meta: { touched, error } } = this.props;
    
            console.log('InputField - render', input, label, id, minlength, maxlength, required, touched, error);
    
            let renderValidation = function() {
                if (touched && !error) {
                    return <i className="fa fa-check tm-form-valid"></i>;
                } else if (touched && error) {
                    return <i className="fa fa-exclamation-triangle tm-form-invalid tooltip tooltip-effect tooltip-item"><span className="tooltip-content clearfix"><span className="tooltip-text">{error}</span></span></i>;
                }
            }
    
            return (<div className="wrapper">
                <span className="input input--isao">
                    <input {...input}
                        className="input__field input__field--isao"
                        spellCheck="false"
                        label={label}
                        id={id}
                        minLength={minlength}
                        maxLength={maxlength}
                        required={required} />
                </span>,
    
                <label className="input__label input__label--isao"
                    htmlFor={id}
                    data-content={label}>
                    <span className="input__label-content input__label-content--isao">
                        {label}
                    </span>
                </label>,
    
                {renderValidation}
            </div>);
        }
    }
    
    InputField.propTypes = {
        input: PropTypes.object.isRequired,
        label: PropTypes.string.isRequired,
        id: PropTypes.string.isRequired,
        minlength: PropTypes.string.isRequired,
        maxlength: PropTypes.string.isRequired,
        required: PropTypes.bool.isRequired,
        meta: PropTypes.object.isRequired,
        touched: PropTypes.bool,
        error: PropTypes.string
    };
    
    export default InputField;
    

    如上所述, render() 只能返回一个元素 .

  • 0

    render() 方法必须返回单个HTML节点 . 正如达里奥在评论中所说,如果你将它全部包装在一个_975686中,它就会起作用 .

相关问题