【问题标题】:Loading indicator inside redux-form在 redux-form 中加载指示器
【发布时间】:2017-04-28 01:54:12
【问题描述】:

我正在尝试在 redux 表单中显示加载指示器,我希望加载指示器放置在卡片内容中(Bulma CSS 框架)。由于渲染函数中的条件检查逻辑,下面的代码是有效的。当ticketnull 时,我马上返回<div>Loading</div>。但是当我删除该条件时,它能够显示加载指示器,但表单无法显示初始值,尽管它包含 redux-form 道具中的初始值。以前有没有人遇到过这样的情况以及如何正确解决这个问题?

import React, { Component } from 'react';
    
    import TicketForm from '../TicketForm/TicketForm';
    import CustomerForm from '../CustomerForm/CustomerForm';
    
    class TicketPanel extends Component {
        componentWillMount() {
            this.props.fetchTicket(this.props.ticketId);
        }
    
        render() {
            const {ticket, loading, error} = this.props.activeTicket;
    
            const isComponentLoading = loading || ticket === null;
            const initialValuesForTicket = isComponentLoading ? {} : ticket.original_ticket_payload;
            const initialValuesForCustomer = isComponentLoading ? {} : ticket.contact;
    
            if (error) {
                return <div>Error</div>
            } else if (ticket === null) {
                return <div>Loading</div>
            }
    
            return (
                <div className="ticket-panel">
                    <TicketForm
                        loading={isComponentLoading}
                        initialValues={initialValuesForTicket} />
                </div>
            )
    
        }
    }
    
    export default TicketPanel;

以下是由呈现表单的逻辑组成的组件代码。它将显示表单组件或加载组件取决于从父级传递的loading props 值。

import React, { Component } from 'react';
    import CSSModules from 'react-css-modules';
    import {Field, reduxForm} from 'redux-form';
    import {ID_TYPE_COLLECTION} from 'utilities/constant';
    
    import styles from './TicketForm.scss';
    
    class TicketForm extends Component {
        renderIdTypes () {
            return ID_TYPE_COLLECTION.map(idType => {
                return <option key={idType.value} value={idType.value}>{idType.title}</option>;
            });
        }
    
        render() {
            const {handleSubmit, loading} = this.props;
    
            const loadingComponentClass = loading ? "card-content" : "is-hidden";
            const formComponentClass = loading ? "is-hidden" : "card-content";
    
            return (
                <div className="card">
                    <header className="card-header">
                        <p className="card-header-title">
                            Ticket
                        </p>
                    </header>
                    <form onSubmit={handleSubmit}>
                        <div className={loadingComponentClass}>
                            <div className="content">
                                <div className="is-component-loading"></div>
                            </div>
                        </div>
                        <div className={formComponentClass}>
                            <div className="content">
                                <div className="field is-horizontal">
                                    <div className="field-label">
                                        <label className="label">
                                            Name
                                        </label>
                                    </div>
                                    <div className="field-body">
                                        <div className="field">
                                            <div className="control">
                                                <Field className="input" name="name" component="input" type="text" placeholder="Name" />
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div className="field is-horizontal">
                                    <div className="field-label">
                                        <label className="label">
                                            ID Type
                                        </label>
                                    </div>
                                    <div className="field-body">
                                        <div className="field">
                                            <div className="control">
                                                <div className="select is-fullwidth">
                                                    <Field className="input" name="owner_id_type" component="select">
                                                        {this.renderIdTypes()}
                                                    </Field>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div className="field is-horizontal">
                                    <div className="field-label">
                                        <label className="label">
                                            NRIC
                                        </label>
                                    </div>
                                    <div className="field-body">
                                        <div className="field">
                                            <div className="control">
                                                <Field className="input" name="nric" component="input" type="text" placeholder="NRIC" />
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div className="field is-horizontal">
                                    <div className="field-label">
                                        <label className="label">
                                            Car Plate
                                        </label>
                                    </div>
                                    <div className="field-body">
                                        <div className="field">
                                            <div className="control">
                                                <Field className="input" name="car_plate" component="input" type="text" placeholder="Car Plate" />
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div className="field is-horizontal">
                                    <div className="field-label">
                                        <label className="label">
                                            Mileage
                                        </label>
                                    </div>
                                    <div className="field-body">
                                        <div className="field">
                                            <div className="control">
                                                <Field className="input" name="mileage" component="input" type="text" placeholder="Mileage" />
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <footer className="card-footer">
                            <a className="card-footer-item">Reset</a>
                            <a className="card-footer-item">Save</a>
                        </footer>
                    </form>
                </div>
            );
        }
    }
    
    TicketForm = reduxForm({
        form: 'TicketForm'  // a unique identifier for this form
    })(TicketForm)
    
    export default CSSModules(TicketForm, styles)

【问题讨论】:

    标签: reactjs redux-form


    【解决方案1】:

    我找到了解决问题的方法。基本上我只是将我的表单移动到另一个功能组件,如下面的代码。我的原始组件将渲染加载指示器,这是 renderLoading 函数和 Form 取决于从父传递的道具。

    import React, { Component } from 'react';
    import CSSModules from 'react-css-modules';
    import {Field, reduxForm} from 'redux-form';
    import {ID_TYPE_COLLECTION} from 'utilities/constant';
    
    import styles from './TicketForm.scss';
    
    let Form = ({handleSubmit}) => {
        const renderIdTypes = () => {
            return ID_TYPE_COLLECTION.map(idType => {
                return <option key={idType.value} value={idType.value}>{idType.title}</option>;
            });
        }
    
        return (
            <form onSubmit={handleSubmit}>
    
                <div className="card-content">
                    <div className="content">
                        <div className="field is-horizontal">
                            <div className="field-label">
                                <label className="label">
                                    Name
                                </label>
                            </div>
                            <div className="field-body">
                                <div className="field">
                                    <div className="control">
                                        <Field className="input" name="name" component="input" type="text" placeholder="Name" />
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div className="field is-horizontal">
                            <div className="field-label">
                                <label className="label">
                                    ID Type
                                </label>
                            </div>
                            <div className="field-body">
                                <div className="field">
                                    <div className="control">
                                        <div className="select is-fullwidth">
                                            <Field className="input" name="owner_id_type" component="select">
                                                {renderIdTypes()}
                                            </Field>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div className="field is-horizontal">
                            <div className="field-label">
                                <label className="label">
                                    NRIC
                                </label>
                            </div>
                            <div className="field-body">
                                <div className="field">
                                    <div className="control">
                                        <Field className="input" name="nric" component="input" type="text" placeholder="NRIC" />
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div className="field is-horizontal">
                            <div className="field-label">
                                <label className="label">
                                    Car Plate
                                </label>
                            </div>
                            <div className="field-body">
                                <div className="field">
                                    <div className="control">
                                        <Field className="input" name="car_plate" component="input" type="text" placeholder="Car Plate" />
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div className="field is-horizontal">
                            <div className="field-label">
                                <label className="label">
                                    Mileage
                                </label>
                            </div>
                            <div className="field-body">
                                <div className="field">
                                    <div className="control">
                                        <Field className="input" name="mileage" component="input" type="text" placeholder="Mileage" />
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <footer className="card-footer">
                    <a className="card-footer-item">Reset</a>
                    <a className="card-footer-item">Save</a>
                </footer>
            </form>
        );
    }
    
    Form = reduxForm({
        form: 'TicketForm'  // a unique identifier for this form
    })(Form)
    
    class TicketForm extends Component {
        renderLoading() {
            return (
                <div>
                    <div className="card-content">
                        <div className="content">
                            <div className="is-component-loading"></div>
                        </div>
                    </div>
                    <footer className="card-footer">
                        <a className="card-footer-item">Reset</a>
                        <a className="card-footer-item">Save</a>
                    </footer>
                </div>
            )
        }
    
        render() {
            const {loading, initialValues} = this.props;
    
            const component = loading
                    ? this.renderLoading()
                    : <Form initialValues={initialValues} />;
    
            return (
                <div className="card">
                    <header className="card-header">
                        <p className="card-header-title">
                            Ticket
                        </p>
                    </header>
                    {component}
                </div>
            );
        }
    }
    
    export default CSSModules(TicketForm, styles)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多