Reactjs 使用MongoDB和React通过表单将信息传递给3个单独的组件

Reactjs 使用MongoDB和React通过表单将信息传递给3个单独的组件,reactjs,Reactjs,我正在为一家漫画店建立一个网站,我正在努力通过表单将信息传递给3个不同的组件(过期、新漫画、交易)。目前,我可以将数据发布到后刊,但我希望根据是后刊、新漫画还是交易将类似信息从表单传递到每个组件 我曾尝试为新的漫画和交易添加产品动作,但仍然不明白如何在表单中识别这些动作 我需要做什么才能让用户在表单上选择其中一个选项,然后将数据正确发布到正确的组件? 到目前为止,我的生产行动是: 到目前为止,我的生产行动是: import React,{Component}来自'React'; 从“../../

我正在为一家漫画店建立一个网站,我正在努力通过表单将信息传递给3个不同的组件(过期、新漫画、交易)。目前,我可以将数据发布到后刊,但我希望根据是后刊新漫画还是交易将类似信息从表单传递到每个组件

我曾尝试为新的漫画和交易添加产品动作,但仍然不明白如何在表单中识别这些动作

我需要做什么才能让用户在表单上选择其中一个选项,然后将数据正确发布到正确的组件?

  • 到目前为止,我的生产行动是:
  • 到目前为止,我的生产行动是:
  • import React,{Component}来自'React';
    从“../../../hoc/user”导入UserLayout;
    从“../../utils/Form/FormField”导入FormField;
    从“../../utils/Form/formActions”导入{update,generateData,isFormValid,populateOptionFields,resetFields};
    从“../../utils/Form/FileUpload”导入文件上载;
    从“react redux”导入{connect}
    从“../../../actions/products\u actions”导入{getCharacters,getPublishers,addProduct,clearProduct}
    类AddProduct扩展组件{
    陈述={
    formError:false,
    成功:错,
    表格数据:{
    姓名:{
    元素:“输入”,
    值:“”,
    配置:{
    标签:“产品名称”,
    名称:'name_input',
    键入:“文本”,
    占位符:“输入标题”
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    说明:{
    元素:“textarea”,
    值:“”,
    配置:{
    标签:“产品说明”,
    名称:'description_input',
    键入:“文本”,
    占位符:“输入您的描述”
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    价格:{
    元素:“输入”,
    值:“”,
    配置:{
    标签:“产品价格”,
    名称:“价格输入”,
    键入:“编号”,
    占位符:“输入您的价格”
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    人物:{
    元素:“选择”,
    值:“”,
    配置:{
    标签:'产品字符',
    名称:“字符输入”,
    选项:[]
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    问题:{
    元素:“输入”,
    值:“”,
    配置:{
    标签:“发行编号”,
    名称:“问题输入”,
    键入:“编号”,
    占位符:“输入问题编号”
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    装运:{
    元素:“选择”,
    值:“”,
    配置:{
    标签:“装运”,
    名称:'shipping_input',
    选项:[
    {key:true,值:'Yes'},
    {key:false,值:'No'},
    ]
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    提供:{
    元素:“选择”,
    值:“”,
    配置:{
    标签:'可用,库存',
    名称:“可用_输入”,
    选项:[
    {key:true,值:'Yes'},
    {key:false,值:'No'},
    ]
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    出版商:{
    元素:“选择”,
    值:“”,
    配置:{
    标签:“出版商”,
    名称:'publisher_input',
    选项:[]
    },
    验证:{
    必填项:true
    },
    有效:假,
    感动:错,,
    验证消息:“”,
    showlabel:正确
    },
    出版:{
    元素:“选择”,
    值:“”,
    配置:{
    标签:“发布”,
    名称:“发布输入”,
    选项:[
    
    export function getProductsToShop(skip, limit, filters  = []){
        const data ={limit, skip, filters}
        const request = axios.post(`${PRODUCT_SERVER}/Shop/back_issues`, data)
            .then(response => {
                    return {
                    size: response.data.size,
                    articles: response.data.articles
                }
            });
    
        return {
            type: GET_PRODUCTS_TO_SHOP,
            payload: request
        }
    
    }
    
    export function getProductsToShop(skip, limit, filters  = []){
        const data ={limit, skip, filters}
        const request = axios.post(`${PRODUCT_SERVER}/Shop/new_comics`, data)
            .then(response => {
                    return {
                    size: response.data.size,
                    articles: response.data.articles
                }
            });
    
        return {
            type: GET_PRODUCTS_TO_SHOP,
            payload: request
        }
    
    }
    
    
    export function getProductsToShop(skip, limit, filters  = []){
        const data ={limit, skip, filters}
        const request = axios.post(`${PRODUCT_SERVER}/Shop/trades`, data)
            .then(response => {
                    return {
                    size: response.data.size,
                    articles: response.data.articles
                }
            });
    
        return {
            type: GET_PRODUCTS_TO_SHOP,
            payload: request
        }
    
    }
    
    import React, { Component } from 'react';
    import UserLayout from '../../../hoc/user';
    import FormField from '../../utils/Form/formfield';
    import { update, generateData, isFormValid, populateOptionFields, resetFields } from '../../utils/Form/formActions';
    import FileUpload from '../../utils/Form/fileupload';
    
    import {connect} from 'react-redux'
    import {getCharacters, getPublishers, addProduct, clearProduct } from '../../../actions/products_actions'
    
    class AddProduct extends Component {
    
        state={
            formError:false,
            formSuccess:false,
            formdata:{
                name: {
                    element: 'input',
                    value: '',
                    config:{
                        label: 'Product title',
                        name: 'name_input',
                        type: 'text',
                        placeholder: 'Enter title'
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                description: {
                    element: 'textarea',
                    value: '',
                    config:{
                        label: 'Product description',
                        name: 'description_input',
                        type: 'text',
                        placeholder: 'Enter your description'
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                price: {
                    element: 'input',
                    value: '',
                    config:{
                        label: 'Product price',
                        name: 'price_input',
                        type: 'number',
                        placeholder: 'Enter your price'
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                character: {
                    element: 'select',
                    value: '',
                    config:{
                        label: 'Product Character',
                        name: 'character_input',
                        options:[]
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                issue: {
                    element: 'input',
                    value: '',
                    config:{
                        label: 'Issue number',
                        name: 'issue_input',
                        type: 'number',
                        placeholder: 'Enter issue number'
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
    
                },
                shipping: {
                    element: 'select',
                    value: '',
                    config:{
                        label: 'Shipping',
                        name: 'shipping_input',
                        options:[
                            {key:true,value:'Yes'},
                            {key:false,value:'No'},
                        ]
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                available: {
                    element: 'select',
                    value: '',
                    config:{
                        label: 'Available, in stock',
                        name: 'available_input',
                        options:[
                            {key:true,value:'Yes'},
                            {key:false,value:'No'},
                        ]
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                publisher: {
                    element: 'select',
                    value: '',
                    config:{
                        label: 'Publisher',
                        name: 'publisher_input',
                        options:[]
    
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
                publish: {
                    element: 'select',
                    value: '',
                    config:{
                        label: 'Publish',
                        name: 'publish_input',
                        options:[
                            {key:true,value:'Public'},
                            {key:false,value:'Hidden'},
                        ]
                    },
                    validation:{
                        required: true
                    },
                    valid: false,
                    touched: false,
                    validationMessage:'',
                    showlabel: true
                },
    
                images:{
                    value:[],
                    validation:{
                        required: false
                    },
                    valid: true,
                    touched: false,
                    validationMessage:'',
                    showlabel: false
                }
            }
        }
    
        updateFields = (newFormData) => {
            this.setState({
                formdata: newFormData
            })
        }
    
    
    
        updateForm = (element) => {
            const newFormdata = update(element,this.state.formdata,'products');
            this.setState({
                formError: false,
                formdata: newFormdata
            })
        }
    
        resetFieldHandler = () => {
            const newFormData = resetFields(this.state.formdata,'products');
    
            this.setState({
                formdata: newFormData,
                formSuccess:true
            });
            setTimeout(()=>{
                this.setState({
                    formSuccess: false
                },()=>{
                    this.props.dispatch(clearProduct())
                })
            },3000)
        }
    
    
        submitForm= (event) =>{
            event.preventDefault();
    
            var dataToSubmit = generateData(this.state.formdata,'products');
            var formIsValid = isFormValid(this.state.formdata,'products')
    
            if(formIsValid){
                this.props.dispatch(addProduct(dataToSubmit)).then(()=>{
                    if( this.props.products.addProduct.success){
                        this.resetFieldHandler();
                    }else{
                        this.setState({formError: true})
                    }
                })
            } else {
                this.setState({
                    formError: true
                })
            }
        }
    
    
        componentDidMount(){
            const formdata =  this.state.formdata;
    
            this.props.dispatch(getCharacters()).then( response => {
                const newFormData = populateOptionFields(formdata,this.props.products.characters, 'character');            
                this.updateFields(newFormData)
    
    
            })
    
            this.props.dispatch(getPublishers()).then( response => {
                const newFormData = populateOptionFields(formdata,this.props.products.publishers, 'publisher');            
                this.updateFields(newFormData)
    
    
            })
        }
    
        imagesHandler = (images) => {
            const newFormData = {
                ...this.state.formdata
            }
            newFormData['images'].value = images;
            newFormData['images'].valid = true;
    
            this.setState({
                formdata:  newFormData
            })
        }
    
    
    
    
        render() {
            return (
                <UserLayout>
                   <div>
                       <h1>Add product</h1>
    
                       <form onSubmit={(event)=> this.submitForm(event)}>
    
                       <FileUpload
                                imagesHandler={(images)=> this.imagesHandler(images)}
                                reset={this.state.formSuccess}
                            />
    
                       <FormField
                           id={'name'}
                           formdata={this.state.formdata.name}
                           change={(element)=> this.updateForm(element)}
                         />
    
    
                        <FormField
                           id={'description'}
                           formdata={this.state.formdata.description}
                           change={(element)=> this.updateForm(element)}
                         />
    
                         <FormField
                           id={'price'}
                           formdata={this.state.formdata.price}
                           change={(element)=> this.updateForm(element)}
                         />
    
                         <div className="form_devider"></div>
    
                         <FormField
                           id={'character'}
                           formdata={this.state.formdata.character}
                           change={(element)=> this.updateForm(element)}
                         />
    
                        <FormField
                           id={'issue'}
                           formdata={this.state.formdata.issue}
                           change={(element)=> this.updateForm(element)}
                         />
    
                        <FormField
                           id={'shipping'}
                           formdata={this.state.formdata.shipping}
                           change={(element)=> this.updateForm(element)}
                         />
    
    
                        <FormField
                           id={'available'}
                           formdata={this.state.formdata.available}
                           change={(element)=> this.updateForm(element)}
                         />
    
    
    
                        <div className="form_devider"></div>
    
                        <FormField
                           id={'publisher'}
                           formdata={this.state.formdata.publisher}
                           change={(element)=> this.updateForm(element)}
                         />
    
    
    
                        <FormField
                           id={'publish'}
                           formdata={this.state.formdata.publish}
                           change={(element)=> this.updateForm(element)}
                         /> 
    
                        {this.state.formSuccess ?
                            <div className="form_success">
                                    Success
                                </div>
                            :null}
    
                            {this.state.formError ?
                                <div className="error_label">
                                    Nope
                                </div>
                                : null}
                            <button onClick={(event) => this.submitForm(event)}>
                                Add product
                            </button>
    
                       </form>
                   </div>
    
    
                </UserLayout>
    
            );
        }
    }
    
    const mapStateToProps = (state) => {
        return {
            products: state.products
        }
    }
    
    export default connect(mapStateToProps)(AddProduct);