【发布时间】:2021-08-09 02:21:07
【问题描述】:
您好我最近在做react,这里有个问题:那么如果我们想把props传递给多层次的组件,如何高效呢??
假设我有三个组件,Parent、Child、ChildOfChild。我想将道具从 Parent 传递给 ChildOfChild。
我所做的是在 Child 和 ChildOfChild 中使用 componentWillReceiveProps。
像这样: 家长:
import React, {Component} from "react";
// @ts-ignore
import Child from "./Child";
class Parent extends Component<any, any> {
constructor(props) {
super(props);
}
render() {
return (
<Child filters={this.state.filters} />
);
}
}
export default () => {
return (<Parent/>)
}
孩子:
import React, {Component} from "react";
import ChildOfChild from "./ChildOfChild";
class Child extends Component<any, any> {
constructor(props) {
super(props);
}
componentWillReceiveProps(nextProps) {
if (nextProps.filters !== this.props.filters) {
this.setState({filters: nextProps.filters});
}
}
public render() {
return <ChildOfChild
filters = {this.state.filters}
uri = {this.state.uri}
label = {this.state.label} />
}
}
export default Child
和 ChildOfChild:
import React from "react";
import {Component} from "react";
import * as _ from 'lodash';
import {makeStyles, createStyles} from '@material-ui/core/styles';
import {BackstageTheme} from '@backstage/theme'
const useStyles = makeStyles<BackstageTheme>(() =>
createStyles({
someStyle: {
position: 'relative',
}
}),
);
interface Props {
filters?: any,
label?: string,
uri?: string
}
class ChildOfChild extends Component<any, any> {
constructor(props) {
super(props);
}
componentWillReceiveProps(nextProps) {
if (nextProps.filters !== this.props.filters) {
this.fetchCountData(nextProps.filters);
}
}
public componentDidMount() {
this.fetchCountData(null);
}
public fetchCountData(filters) {
if (filters != null && Object.keys(filters).length > 0) {
// get data from api
}
}
public render() {
const popOverText = this.props.label; // used somewhere
const classes = this.props.classes;
return (
<p className={classes.someStyle}>
{title}
</p>
);
}
}
export default (props:Props) => {
const classes = useStyles();
return (
<ChildOfChild classes={classes} {...props}/>
)
}
我也尝试过“componentDidUpdate”,用法非常相似,但正如这里提到的:https://stackoverflow.com/a/51313510/11650363 它们是不同的。
所以我只想问我的解决方案如何?有什么缺点吗?? 将道具传递给多层的任何其他好的解决方案?
【问题讨论】:
-
出于所有意图和目的,
componentWillReceiveProps已被弃用 (reactjs.org/docs/…)。只需将 props 传递给 child 的 child,不需要存储在中间组件的本地 state 中,实际上将传递的 props 存储到 state 中是 React 中的一种反模式。 -
@DrewReese 让你详细说明一下,如何传递道具而不将其存储在中间组件中,您的意思是删除中间组件???
标签: javascript reactjs react-native