Реагируйте значения Dynami c для выпадающего меню Select semanti c UI - PullRequest
0 голосов
/ 07 января 2020

Я использую избыточную форму ":" ^ 7.4.2 ", формы и у меня очень простая форма с выпадающим списком, и она должна быть заполнена из моей таблицы пользователей базы данных только фильтром данных зарегистрированным пользователем.

Теперь я могу заполнить обычный элемент выбора, используя следующий код

 const personList = persons && persons.map((item, i) => {
            return (
                <option key={item.id} value={item.FullName}>{item.FullName}</option>
            )
        })
  <select onChange={this.selectPerson}>
                                {personList}
                            </select>

Но когда мне нужно заполнить, используя форму, этого не происходит, я не уверен, как это сделать для этой динами c значения здесь - это личные значения, которые меня интересуют для выпадающего списка

enter image description here

SelectInput.jsx

import React from 'react'
import { Form, Select, Label } from 'semantic-ui-react';

const SelectInput = ({
    input,
    placeholder,
    type,
    multiple,
    options,
    meta: { touched, error }
}) => {
    return (
        <Form.Field error={touched && !!error}>
            <Select
                value={input.value || null}
                onChange={(error, data) => input.onChange(data.value)}
                placeholder={placeholder}
                options={options}
                multiple={multiple}
            />
            {touched && error && <Label basic color='red'>{error}</Label>}
        </Form.Field>
    )
}

export default SelectInput

Вот моя форма EarningTypeForm.jsx

    import React, { Component } from 'react'
    import { Segment, Form, Button, Grid, Header } from 'semantic-ui-react';
    import { connect } from 'react-redux';
    import { reduxForm, Field } from 'redux-form';
    import { composeValidators, combineValidators, isRequired, hasLengthBetween } from 'revalidate';
    import { createEarningType, updateEarningType, deleteEarningType } from '../earningtypeActions';
    import TextInput from '../../../app/form/TextInput';
    import SelectInput from '../../../app/form/SelectInput';
    import { firestoreConnect } from 'react-redux-firebase';

    import { compose } from 'redux';
    const PersonsArray = [
        { key: '1', text: 'Harry', value: 'Harry' },
        { key: '2', text: 'John', value: 'John' },
        { key: '3', text: 'Jane', value: 'Jane' },

    ];


    const actions = { createEarningType, updateEarningType, deleteEarningType };

    const mapState = (state, ownProps) => {
        const earningTypeID = ownProps.match.params.id;
        let earningType = {};


        if (state.firestore.ordered.earningTypes && state.firestore.ordered.earningTypes.length > 0) {
            earningType = state.firestore.ordered.earningTypes.filter(earningType => earningType.id === earningTypeID)[0] || {};
        }

        return {
            initialValues: earningType,
            earningType,
            auth: state.firebase.auth,
            persons: state.firestore.ordered.persons,

        }

    }

    const validate = combineValidators({
        EarningTypeName: composeValidators(
            isRequired({ message: 'The FullName is needed' }),
            hasLengthBetween(1, 50)({ message: 'Earning Type must be between 1 to 50 char' })

        )()

    })


    class EarningTypeForm extends Component {

        async componentDidMount() {
            const { firestore, match } = this.props;
            await firestore.setListener(`earningTypes/${match.params.id}`);
        }

        async componentWillUnmount() {
            const { firestore, match } = this.props;
            await firestore.unsetListener(`earningTypes/${match.params.id}`);
        }

        onFormSubmit = async values => {
            try {
                if (this.props.initialValues.id) {
                    this.props.updateEarningType(values);
                    this.props.history.push(`/earningtype/${this.props.initialValues.id}`)
                }
                else {
                    // values.BirthDate = new Date(values.BirthDate)
                    let createdEarningType = await this.props.createEarningType(values);
                    this.props.history.push(`/earningtype/${createdEarningType.id}`)
                }
            }
            catch (error) {
                console.log(error);
            }
        }

        render() {
            const { history, initialValues, invalid, submitting, pristine, persons } = this.props;
            const personList = persons && persons.map((item, i) => {
                return (
                    <option key={item.id} value={item.FullName}>{item.FullName}</option>
                )
            })
            // const arr = Object.values(persons);
            // console.log(arr)
            return (
                <Grid>
                    <Grid.Column width={10}>
                        <Segment>
                            <Header sub color='teal' content='Earning Types Details' />
                            <Form onSubmit={this.props.handleSubmit(this.onFormSubmit)} autoComplete='off'>

                                <Field name='EarningType' component={TextInput} placeholder="Earning Types" />


                                <Header sub color='teal' content='Person Type' />

                                <Field name='PersoName' component={SelectInput} options={PersonsArray} placeholder="Select Person name" />
                                <select onChange={this.selectPerson}>
                                    {personList}
                                </select>                           


<Button disabled={invalid || submitting || pristine} positive type="submit">
                                    Submit
                                </Button>
                                <Button type="button" onClick={initialValues.id
                                    ? () => history.push(`/earningtype/${initialValues.id}`)
                                    : () => history.push('/earningtypes')

                                }>Cancel</Button>
                            </Form>
                        </Segment >
                    </Grid.Column>
                </Grid >

            )
        }
    }


    // export default withFirestore(connect(mapState, actions)(
    //     reduxForm({form: 'EarningTypeForm', validate, enableReinitialize: true })(EarningTypeForm)));


    export default compose(connect(mapState, actions),
        firestoreConnect((props) => {
            if (!props.auth.uid) return []
            return [
                {
                    collection: 'persons',
                    where: [
                        ['createdUID', '==', props.auth.uid]
                    ]

                }
            ]
        }), reduxForm({ form: 'EarningTypeForm', validate, enableReinitialize: true }))(EarningTypeForm);


  [1]: https://i.stack.imgur.com/U7C9J.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...