gpt4 book ai didi

javascript - 将 props 设置为子组件中的状态

转载 作者:行者123 更新时间:2023-12-02 23:06:59 24 4
gpt4 key购买 nike

这里我想在子组件中设置 props 来声明。我有一个充满 ajax 请求的表。顺便说一句,我正在使用 antd 图书馆。我的 table 上有一个“编辑”按钮,应该打开一个包含表单的模式。

父组件

  import React, {Component} from 'react';
import axios from 'axios';
import API from '../../Helpers/Api'
import {Table, Divider, Tag, message, Popconfirm, Icon} from 'antd';
import {
Card,
CardBody,
CardHeader,
Col,
Row
} from 'reactstrap';
import EditCountry from './EditCountry'


var token = JSON.parse(localStorage.getItem("token"));
let config = {
headers: {
Authorization: token,
Accept: 'application/json'
}
}


class ListCountry extends Component {
constructor(props) {
super(props);
this.columns = [
{
title: 'نام کشور‌',
dataIndex: 'name',
key: 'name',
// render: text => <a href="javascript:;">{text}</a>,
},
{
title: 'وضعیت',
dataIndex: 'isForeign',
key: 'isForeign',
render: isForeign => (
<div>
<Tag color={isForeign ? 'blue' : 'purple'}>
{isForeign ? 'کشور خارجی است' : 'کشور خارجی نیست'}
</Tag>

</div>
),
},
{
title: '',
dataIndex: '',
key: 'x',
render: (text, record) =>
this.state.countries.length >= 1 ? (
<span>
<a onClick={() => this.handleEdit(record.key)}>ویرایش کشور</a>
<Divider type="vertical" />
<Popconfirm
icon={<Icon type="question-circle-o" style={{ color: 'red' }} />}
title="آیا از حذف این کشور مطمئن هستید؟"
onConfirm={() => this.handleDelete(record.key)}
okText="حذف"
cancelText="لغو"
>
<a>حذف کشور</a>
</Popconfirm>
</span>

) : null,
},
];
this.state = {
countries: [],
openModal: false,
rowId:''
}
}

getCountries = e => {
var self = this;
axios.get( API + '/country',
config
)
.then(function (response) {

const results= response.data.map(row => ({
key: row._id, // I added this line
name: row.name,
isForeign: row.isForeign,
Id: row._id,
}))
self.setState({ countries : results });
})
.catch(function (error) {
console.log(error);
});
};
componentDidMount() {
this.getCountries();
}

handleDelete = id => {
var self = this;
axios.delete( API + `/country/${id}`,
config
)
.then(function (response) {
const countries = [...self.state.countries];
self.setState({ countries: countries.filter(item => item.key !== id) });
message.success('عملیات حذف با موفقیت انجام شد.')
})
.catch(function (error) {
console.log(error);
});
}

handleEdit = id => {
this.setState({
rowId: id,
openModal: !this.state.openModal
})
}
render() {
return (
<div className="animated fadeIn">
<Row className="justify-content-center">
<Col xs="12" md="12">
<Card>
<CardHeader>
<strong>لیست کشورها</strong>
</CardHeader>
<CardBody>
<Table className="rtl text-right" columns={this.columns} dataSource={this.state.countries}/>
<EditCountry open={ this.state.openModal } handleEdit= {this.handleEdit} rowId={ this.state.rowId } />
</CardBody>
</Card>
</Col>
</Row>
</div>
)
}
}

导出默认ListCountry;

子组件

    class EditCountry extends Component {

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

handleCancel = () => {
this.props.handleEdit();
};
render() {
return (
<div>
<Modal
title="Basic Modal"
>
// form
</Modal>
</div>
);
}
}

所以正如你所看到的,我将 props 设置为状态,但 id 为空,我是否遗漏了一些东西?提前致谢

最佳答案

rowID 的流程如下:

  1. 您将父级的初始状态设置为 rowId = ""
  2. 您将其传递给子组件,它会保存在子状态中
  3. 您可以这样调用 this.props.handleEdit: this.props.handleEdit();
  4. 您在handleEdit中使用rowId: id更新您的状态
  5. 父 rowId 不会复制到子 state id,因为它仅在组件构造函数中设置。

一开始,rowId是“”,因为这是父级状态的默认值=>这将是子级的id。

问题是,您在没有 id 的情况下调用 this.props.handleEdit 。这会将您的 rowId 设置为在父级中未定义。

您必须在代码中的某个位置设置 rowId,例如在子组件中,如下所示:

 this.props.handleEdit(myID); or this.props.handleEdit(this.state.id);

这将设置 id,rowID 将被定义为您传递给 handleEdit 的任何内容。

但这不会更新子组件中状态的 id,因为在父状态更新后不会再次调用构造函数。

要更新子状态,您必须使用 componentDidUpdate 监听 rowId 更改或直接从父组件使用 this.props.rowId 。

componentDidUpdate(prevProps) {
if (this.props.rowId!== prevProps.rowId) {
this.setState({id: this.props.rowId});
}
}

希望这有帮助。

关于javascript - 将 props 设置为子组件中的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57544292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com