当前位置: 首页 > 知识库问答 >
问题:

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

卫乐童
2023-03-14

我试图使用redux-form渲染以下自定义字段组件,我也传递自定义道具到字段组件,但是它一直给我一个错误如下:

不变的js:42未捕获错误:对象作为React子对象无效(找到:具有键{renderValidation}的对象)。如果要呈现子对象集合,请改用数组。在InputField中(由ConnectedField创建)在ConnectedField中(由ConnectedField创建)在Connect中(由Field创建)在Field中(由LoginForm创建)在div中(由LoginForm创建)在form中(由LoginForm创建)在LoginForm中(由form(LoginForm创建))在form(LoginForm)中(由Connect(form(LoginForm(LoginForm))在Connect中创建在路由器中的div中的div中的div中的div中的div中的div(通过登录创建)在div中的div(通过登录创建)在div中的div中的div(通过登录创建)在div中的div中的div(通过登录创建)在登录中的部分(通过登录创建)在路由器中的div中的Connect(通过登录创建(由ConnectedRouter创建)在Conference(invariant.js:42)的ConnectedRouter提供程序中,在ConferenceChildFileDfiers(react dom.development.js:6748)的ConferenceChildrenateExpirationTime(react dom.development.js:7756)的ConferenceChildren(react dom.development.js:7747)的InvalidObject类型中在workLoop(react dom.development.js:10288)的PerformityWork(react dom.development.js:8225)的updateClassComponent(react dom.development.js:7881)和beginWork(react dom.development.js:7850)的finishClassComponent(react dom.development.js:7881)

VM250629:20组件中出现上述错误:在InputField(由ConnectedField创建)在ConnectedField(由Connect(连接字段)创建)在Connect(连接字段)(由字段创建)在Field(由LoginForm创建)在div(由LoginForm创建)在表单(由LoginForm创建)在LoginForm(由Form(LoginForm)创建)在Form(LoginForm)(由Connect(Form(LoginForm)创建))在Connect(Form(LoginForm))(由ReduxForm创建)在ReduxForm(由Login创建)在div(由Login创建)在div(由Login创建)在div(由Login创建)在div(由登录创建)在div(由登录创建)在节(由登录创建)在登录(由连接(登录)创建)在连接(登录)(由路由创建)在路由在提供商的连接路由器中的div(由连接路由器创建)

考虑将错误边界添加到树中以自定义错误处理行为。

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个答案

糜雪峰
2023-03-14

render()方法必须返回单个HTML节点。正如Dario在评论中所说,如果你把它全部用

咸育
2023-03-14
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;

如上所述,渲染()只能返回一个元素。

 类似资料:
  • 问题内容: 我可能缺少一些非常明显的东西,想让自己清楚。 这是我的理解。 在幼稚的react组件中,我们有&。更新时会重新渲染整个组件。大多是只读的,更新它们没有任何意义。 在订阅redux商店的react组件中,通过类似于,它每次商店更新时都会重新渲染。 react- redux 有一个帮助程序,通常通过类似这样的方法来注入状态树的一部分(组件感兴趣)和actionCreators 组件 但是,

  • 我遇到了这个简单的React函数组件,它渲染四次,而我希望它最初渲染一次,执行useffect更新状态,然后再次渲染。相反,控制台发送4个日志输出,表示它渲染了4次。了解react功能组件的基本生命周期的原因和资源吗? https://codesandbox.io/s/solitary-tree-t120d?file=/src/App.js:149-191

  • 我正在尝试将准备渲染器组件与自定义单元格渲染器一起使用。这个想法是使用准备渲染器绘制整行,并使用客户单元格渲染器绘制基于单元格值的自定义。 prepareRenderer 通过突出显示整行来按预期工作,但自定义单元格呈现器突出显示的单元格不会显示颜色,除非选定该属性。自定义单元格呈现似乎仅在单元格选择时起作用(突出显示包含 1 的单元格,但仅在选择时)。 关于如何使两者齐头并进,有什么想法吗? 下

  • 我正在创建一个带有两个滑块(实际上是三个)的自定义表单,因为我将两个滑块转换为一个范围滑块。 我正在使用。 使用JS,我为自定义范围滑块添加了一些限制。 代表最大值的输入值不能小于最小值 最小值和最大值的起始值分别为0和100 现在,由于某些原因,当您将最小值调整到大于100,然后将其更改回小于100时,自定义范围滑块会中断 更新:或者一旦最小值设置为8或更高-_- 最大值设置为(最小值100),

  • 我对React Router中路由的渲染顺序有问题。据我所知,任何子路由都将在其父路由之后进行渲染,因此将在DOM中的父路由之上进行渲染。 <代码> 我有这个路由器设置,但是在我从IndexRoute导航到/browse路由之后,浏览路由呈现在我的导航组件的顶部,我不能单击导航组件上的任何内容。 我的问题是如何强制Nav组件始终最后渲染,或者是否有更好的方法来构建我的应用程序以避免这种情况。 谢谢