javascript - React中将数据从子组件传递到父组件

标签 javascript forms reactjs

我目前正在构建一个简单的 React 应用程序。我有一些数据从 laravel 应用程序传递到 window.example 对象。然后我想访问数据,我发现我最初可以使用 props 来做到这一点。但问题是,当我提交表单时,在AssignmentForm组件中,我想更新AssignmentBox中显示数据的数据,并添加一行数据。我该怎么做?

所以我的结构如下所示:

  • 仪表板应用程序
    • 作业框
    • 新作业表

这是我的代码:

ma​​in.js:

import swal from 'sweetalert';
import $ from 'jquery';
import React from 'react';
import { render } from 'react-dom';
import DashboardApp from './components/Dashboard';

render(
    <DashboardApp tracks={window.tracks} assignments={window.assignments} />,
    document.getElementById('content')
);

Dashboard.js:

import React from 'react';
import {Grid, Row, Col} from 'react-bootstrap';
import TrackBox from './TrackBox';
import TrackFormStop from './TrackFormStop';
import TrackFormNew from './TrackFormNew';
import AssignmentBox from './AssignmentBox';
import AssignmentFormNew from './AssignmentFormNew';

class DashboardApp extends React.Component {
    render () {
        return (
            <Grid>
                <Row>
                    <Col md={12}>
                        <AssignmentBox assignments={this.props.assignments} />
                        <AssignmentFormNew />
                    </Col>
                </Row>
            </Grid>
        )
    }
}

export default DashboardApp;

AssignmentBox.js

import React from 'react';
import {Panel} from 'react-bootstrap';

const title = (
  <h2>Current Assignments</h2>
);

class AssignmentBox extends React.Component {
    render () {
        return (
            <Panel header={title}>
                <ul>
                    {this.props.assignments.map(item => (
                        <li key={item.id}><a href="assignment/{item.slug}">{item.title}</a></li>
                    ))}
                </ul>
            </Panel>
        )
    }
}

export default AssignmentBox;

AssignmentFormNew.js

import React from 'react';
import {Panel, Button, FormGroup, ControlLabel} from 'react-bootstrap';
import $ from 'jquery';

const title = (
    <h2>New Assignment</h2>
);

const footer = (
    <Button bsStyle="primary" type="submit" block>New Assignment</Button>
);

class AssignmentFormNew extends React.Component {
    constructor (props) {
        super(props);
        this.state = {
            title: '',
            description: '',
            customer: '',
            date: ''
        };

        this.handleSubmit = this.handleSubmit.bind(this);

        this.handleTitleChange = this.handleTitleChange.bind(this);
        this.handleDescriptionChange = this.handleDescriptionChange.bind(this);
        this.handleCustomerChange = this.handleCustomerChange.bind(this);
        this.handleDeadlineChange = this.handleDeadlineChange.bind(this);
    }

    handleSubmit (e) {
        e.preventDefault();

        console.log(window.Laravel.csrfToken);

        $.ajax({
            url: '/assignment',
            type: 'POST',
            data: {
                _token: window.Laravel.csrfToken,
                title: this.refs.title.value,
                description: this.refs.description.value,
                customer: this.refs.customer.value,
                deadline: this.refs.deadline.value
            },
            success: res => {
                this.setState({
                    title: '',
                    description: '',
                    customer: '',
                    deadline: ''
                });

                console.log(res);
            },
            error: (xhr, status, err) => {
                console.error(status, err.toString());
            }
        });
    }

    handleTitleChange (event) {
        this.setState({title: event.target.value});
    }

    handleDescriptionChange (event) {
        this.setState({description: event.target.value});
    }

    handleCustomerChange (event) {
        this.setState({customer: event.target.value});
    }

    handleDeadlineChange (event) {
        this.setState({deadline: event.target.value});
    }

    render () {
        return (
            <form onSubmit={this.handleSubmit}>
                <Panel header={title} footer={footer}>
                    <FormGroup controlId="assignmentTitle">
                        <ControlLabel>Title</ControlLabel>
                        <input type="text" ref="title" placeholder="e.g. Crowdfunding module for prestashop" className="form-control" value={this.state.title} onChange={this.handleTitleChange} />
                    </FormGroup>
                    <FormGroup controlId="assignmentDescription">
                        <ControlLabel>Description</ControlLabel>
                        <textarea className="form-control" ref="description" rows="10" value={this.state.description} onChange={this.handleDescriptionChange} />
                    </FormGroup>
                    <FormGroup controlId="assignmentCustomer">
                        <ControlLabel>Customer</ControlLabel>
                        <input type="text" placeholder="e.g. John Doe" ref="customer" className="form-control" value={this.state.customer} onChange={this.handleCustomerChange} />
                    </FormGroup>
                    <FormGroup controlId="assignmentDeadline">
                        <ControlLabel>Deadline</ControlLabel>
                        <input type="date" className="form-control" ref="deadline" value={this.state.deadline} onChange={this.handleDeadlineChange} />
                    </FormGroup>
                </Panel>
            </form>
        )
    }
}

export default AssignmentFormNew;

提前谢谢您。

最佳答案

将您的handleSubmit()函数放入Dashboard.js中,并添加以下代码

 constructor (props) {
        super(props);
        this.state = {
            assignments:this.props.assignments
        };
}

handleSubmit (e) {
  ... your ajax code
  this.setState({assignments:res})
}

<AssignmentBox assignments={this.state.assignments} handleSubmit={this.handleSubmit}/>

然后在AssignmentFormNew.js中更改:

<form onSubmit={this.props.handleSubmit}>

基本上,当您单击提交时,它会调用 Dashboard.js 中父级的 handleSubmit 函数,然后在 ajax 调用之后更新状态,以便分配框将使用新数据重新渲染它。

关于javascript - React中将数据从子组件传递到父组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096944/

相关文章:

javascript - 在数组中存储和检索数据

javascript - Angular JS 中的多级 json 过滤器

c# - 如何在我的 WPF 表单中为我的 BackgroundImage 设置图像?

javascript - 提交折叠 div 并更改 div 中的图像后的 Ajax 表单

javascript - ReactJS + Redux : Where to properly include CSS and index. html 文件?

javascript - Node - 将 JSON 文件加载到代码中

javascript - Mongoose - $并且无法正常运行,需要找到包含这两个项目的数组

javascript - 在 Gatsby 站点中集成 Drift 聊天服务

javascript - onsubmit 处理程序无法捕获使用链接中的 submit() 提交的表单

javascript - 数据无法从 React/Flux 应用程序中的 API 更新