3 формы в одно состояние с помощью редукса? - PullRequest
0 голосов
/ 11 марта 2019

Я впервые играю с редуксом и нахожу его довольно запутанным, ха-ха. Это не так просто, как кажется.У меня есть реактивный проект, где у меня есть форма, которая разделена на 3 части (компоненты).Каждый из этих компонентов имеет свое собственное состояние для сохранения данных формы этого компонента.

Вот где я собирался реализовать избыточность.

Моя цель здесь - сохранить состояние всех трех компонентов в хранилище реагирования.Таким образом, при отправке каждой из трех частей формы все они будут объединены в одно большое состояние в хранилище с избыточностью, и я могу делать с ним все, что захочу.

Сейчас я установил избыточность, создал хранилищеи теперь я потерялся, ха-ха. Может ли кто-нибудь помочь или даже направить меня на полезный ресурс?Я просмотрел документацию по редуксу и просто не могу разобраться с этим

Моя форма:

return (
            <Form onSubmit={this.handleSubmit} className="form">
                {/* General Information */}
                <FormGroup row>
                    <Col sm={6}>
                        <Input type="text" onChange={this.handleChange} name="siteName" id="siteName" placeholder={this.placeholders.siteName}/>
                    </Col>
                    <Col sm={6}>
                        <Input className="form-control" type="select" id="counties" onChange={this.handleChange}>
                            <option className="selectDefault" disabled value={this.placeholders.siteCounties} selected>{this.placeholders.siteCounty}</option>
                            { this.counties.map(c => (<option key={c.value} value={c.value}>{c.display}</option>))}
                        </Input>
                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={12}>
                        <Input type="textarea" onChange={this.handleChange} name="siteAddress" placeholder={this.placeholders.siteAdd} id="siteAddress" />
                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={6}>
                        <Input type="email" name="siteEmail" onChange={this.handleChange} id="siteEmail" placeholder={this.placeholders.email} />
                    </Col> 
                    <Col sm={6}>
                        <Input type="tel" name="siteNumber" onChange={this.handleChange} id="siteNumber" placeholder={this.placeholders.number}/>
                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={6}>
                        <Input type="select" name="siteCat" onChange={this.handleChange} id="siteCat" multiple placeholder={this.placeholders.categories}>
                            <option className="selectDefault" disabled selected>{this.placeholders.categories}</option>
                            { this.categories.map(c => (<option key={c.value} value={c.value}>{c.display}</option>))}
                        </Input>
                    </Col>
                    <Col sm={6}>
                        <Input type="textarea" name="openTimes" onChange={this.handleChange} id="openTimes" placeholder={this.placeholders.times} />
                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={6}>
                        <Input type="textarea" name="fees" onChange={this.handleChange} id="fees" placeholder={this.placeholders.fees}/>
                    </Col>
                    <Col sm={6}>
                        <Input type="text" name="access" onChange={this.handleChange} id="access" placeholder={this.placeholders.access} />
                    </Col>
                </FormGroup>
                <hr/>
                {/* Location Information */}
                <FormGroup row> 
                    <Col sm={6}>
                        <Input type="text" name="gps" onChange={this.handleChange} id="gps" placeholder={this.placeholders.gps}/>
                    </Col>
                    <Col sm={6}>
                        <Input type="text" name="w3w" id="w3w" onChange={this.handleChange} placeholder={this.placeholders.w3w} />
                    </Col>
                </FormGroup>
                <hr/>
                <FormGroup row>
                    <Col sm={12}>
                        <Input type="textarea" name="txtHeader" onChange={this.handleChange} id="txtHeader" placeholder={this.placeholders.textHeader} />
                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={12}>
                        <Input type="textarea" name="txtContent" onChange={this.handleChange} id="txtContent" placeholder={this.placeholders.textContent} />
                    </Col>
                </FormGroup>
                <FormGroup check row>
                    <Col sm={{ size: 10, offset: 2 }}>
                        <Button disabled={!this.validateForm()} type="submit" className="btn-primary">Tours &rarr;</Button>
                    </Col>
                </FormGroup> 
            </Form>
        );

Состояние формы:

constructor(props) {
        super(props);

        this.state = {
            language: this.props.language,
            siteName: '',
            counties: '',
            siteAddress: '',
            siteEmail: '',
            siteNumber: '',
            siteCat: '',
            openTimes: '',
            fees: '',
            access: '',
            gps: '',
            w3w: '',
            txtHeader: '',
            txtContent: '',
            isLoading: false
        };

    }

    validateForm() {
        if (this.state.siteName != '' &&
            this.state.siteAddress != '' &&
            this.state.siteEmail != '' &&
            this.state.siteNumber != '' &&
            this.state.openTimes != '' && 
            this.state.fees != '' && 
            this.state.access != '' && 
            this.state.gps != '' && 
            this.state.w3w != '' && 
            this.state.txtHeader != '' && 
            this.state.txtContent != '') {
                return true;
            } else {
                return false;
            }
    }

    handleChange = e => {
        this.setState({ ...this.state, [e.target.name]: e.target.value });
        console.log(this.state);
    }

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я бы порекомендовал вам взглянуть на redux-form.

Поскольку у вас уже есть redux в качестве зависимости, вы можете воспользоваться всеми абстракциями формы, этими redux-formуже реализовали его для нас.

Согласно вашему сценарию использования, redux-form уже реализовал такое поведение формы, известное как Форма мастера .

Вот полный рабочий пример: https://redux -form.com / 8.1.0 / examples / wizard /

0 голосов
/ 11 марта 2019

redux - это контейнер с предсказуемым состоянием, который действует как ваша единственная точка правды, манипулируя вашими данными, можно с помощью действий, которые являются чистыми функциями.

how redux works

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

Например, первое, что вам нужно сделать, это установить необходимые зависимости:

npm install redux react-redux --save

после его установки создайте файл с именем store.js со следующим кодом:

import {combineReducers,createStore} from 'redux'

// Your Reducer
import myReducer from './myreducer'

// we use combineReducers to be able to add more than one.
const reducers = combineReducers({
    mystate:myReducer
})


export default createStore(reducers);

тогда давайте создадим этот редуктор myreducer.js:

// this is your pure function has 2 params
// first one is the state it immutable 
// then the action which is the action you dispatched with its paylod
const myReducer = (state = [], action) => {

    switch (action.type) {
        case "ADD_ITEM":
            // i created a new array and spread the data in it to be immutable 
            return [...state,action.item]
        // you always need this becuse redux will run all the reducers.    
        default:
            return state;
    }

 }

export default myReducer;

Теперь вернитесь к компоненту App.js и сделайте его следующим образом:

/*
The <Provider /> makes the Redux store available to any nested components that have been wrapped in the connect() function.

Since any React component in a React Redux app can be connected, most applications will render a <Provider> at the top level, with the entire app’s component tree inside of it.

Normally, you can’t use a connected component unless it is nested inside of a <Provider>.

*/
import React, {Component} from 'react';
import {Provider} from 'react-redux'
import store from './store'

export default class App extends Component {
    render(){
        return (
         <Provider store={store}>
         // your app
         </Provider>
        )
    }
}

Рекомендую перейти к быстрому старту (https://react -redux.js.org / введение / быстрый старт )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...