gpt4 book ai didi

reactjs - 将 Class 组件 react 到 Hooks

转载 作者:行者123 更新时间:2023-12-04 07:14:44 24 4
gpt4 key购买 nike

我正在转换这个 Class 组件

class Pricing extends React.Component {
state = {
loading: true,
pricelist: {
pricelistEntries: [],
name: '',
monthlySubscriptionFee: '',
currency: '',
validFrom: '',
smsInPackage: '',
},
nextPackage: undefined,
showNextPackage: false,
};

componentDidMount() {
const { getData } = this.props;
getData(
'price-lists/profile',
{ defaultSort, resourceArrayName: 'pricelist' },
true
).then((res) => {
this.setState({
pricelist: res.data._embedded.pricelist[0],
nextPackage: res.data._embedded.pricelist[1],
loading: false,
});
});
}

handleShowNextPackageDetails = () => {
this.setState((state) => ({ showNextPackage: !state.showNextPackage }));
};

render() {
const { classes } = this.props;
const { pricelist, loading, showNextPackage, nextPackage } = this.state;
return (
<React.Fragment>
<Paper className={classes.root}>
<Loading loading={loading} spinner>
<React.Fragment>
<Typography variant="body1" style={{ marginBottom: 10 }}>
<FormattedMessage id="administration.packages.form.section.package.info" />
</Typography>
<PackageView pricelist={pricelist} />
</React.Fragment>
</Loading>
</Paper>
{nextPackage && (
<Paper className={classes.next}>
<div style={{ display: 'flex' }}>
<Typography variant="body1" style={{ flexGrow: 1 }}>
<FormattedMessage id="account.packages.form.section.next.package" />
</Typography>
<Button
color="secondary"
onClick={this.handleShowNextPackageDetails}
size="small"
style={{ marginBottom: '5px' }}
>
<FormattedMessage id="account.balance.details.label" />
<ExpandMoreIcon
className={classnames(classes.expand, {
[classes.expandOpen]: showNextPackage,
})}
/>
</Button>
</div>
<Collapse in={showNextPackage} timeout="auto" unmountOnExit>
<PackageView pricelist={nextPackage} />
</Collapse>
</Paper>
)}
</React.Fragment>
);
}
}
到这个功能组件
const Pricing = props => {
const [initialState, setInitialState] = useState(
{
loading: true,
pricelist: {
pricelistEntries: [],
name: '',
monthlySubscriptionFee: '',
currency: '',
validFrom: '',
smsInPackage: '',
},
nextPackage: undefined,
showNextPackage: false,
},
);

useEffect(() => {
const { getData } = props;
getData(
'price-lists/profile',
{ defaultSort, resourceArrayName: 'pricelist' },
true
).then((res) => {
setInitialState({
pricelist: res.data._embedded.pricelist[0],
nextPackage: res.data._embedded.pricelist[1],
loading: false,
});
});
}, []);

const handleShowNextPackageDetails = () => {
setInitialState(!showNextPackage);
};

const { classes } = props;
const { pricelist, loading, showNextPackage, nextPackage } = initialState;
return (
<React.Fragment>
<Paper className={classes.root}>
<Loading loading={loading} spinner>
<React.Fragment>
<Typography variant="body1" style={{ marginBottom: 10 }}>
<FormattedMessage id="administration.packages.form.section.package.info" />
</Typography>
<PackageView pricelist={pricelist} />
</React.Fragment>
</Loading>
</Paper>
{nextPackage && (
<Paper className={classes.next}>
<div style={{ display: 'flex' }}>
<Typography variant="body1" style={{ flexGrow: 1 }}>
<FormattedMessage id="account.packages.form.section.next.package" />
</Typography>
<Button
color="secondary"
onClick={handleShowNextPackageDetails}
size="small"
style={{ marginBottom: '5px' }}
>
<FormattedMessage id="account.balance.details.label" />
<ExpandMoreIcon
className={classnames(classes.expand, {
[classes.expandOpen]: showNextPackage,
})}
/>
</Button>
</div>
<Collapse in={showNextPackage} timeout="auto" unmountOnExit>
<PackageView pricelist={nextPackage} />
</Collapse>
</Paper>
)}
</React.Fragment>
);

}
但是,应该更改 nextPackage 可见性的按钮不工作。在类组件上它工作正常,并且功能性不想在单击时扩展内容。对象的状态可能有问题吗?
有没有更好的方法来转换这个组件以及如何制作 handleShowNextPackageDetails工作?

最佳答案

当您将状态设置为:setInitialState(!showNextPackage);您也在覆盖其他状态变量。所以对象变成:false :
而是在所有 setInitialState 中使用扩展运算符因为它是一个对象:

setInitialState(is => ({...is, nextPackage: !is.nextPackage})
另外,更新价目表的示例:
const addEntry = priceListEntry => {
setInitialState(is => ({
...is, pricelistEntries: [...is.pricelistEntries, priceListEntry]
}))
}
解释:
扩展运算符允许您更改所需的字段,而其他字段保持不变。和 issetInitialState(is只是当前状态。因此,您保留当前状态,而不是要更改的字段:

let obj = {name: 'Test', value: 10}
console.log(obj)

obj = {...obj, value: 15}
console.log(obj)

obj = {...obj, newValue: 20}
console.log(obj)

关于reactjs - 将 Class 组件 react 到 Hooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68834380/

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