如何将道具从父母传给孩子?

时间:2019-02-14 05:08:40

标签: javascript reactjs react-native react-redux

我想将道具从App.js(父项)传递到CommentItem.js(子项),再传递给Button.js(子项的子项), 但是在Button,js(child的子代)组件中,道具为空。

  1. App.js(父项)到CommentItem.js(子项)

我将mainuser: this.state.head推送到FlatList,并且renderItem={({ item }) => <CommentItem {...item}传递的道具(主要用户)

然后,CommentItem.js(child)通过下面的代码收到了mainuser

const {
    head,
    text,
    created,
    mainuser,
    subuser,
  } = 
  1. CommentItem.js(子项)到Button.js(子项的子项)

我认为道具是由, 和Button(孩子的孩子)通过以下代码接收道具。

const {
      mainuser,
    } = this.props;

但是,道具id在Button.js(child的子代)中为空。

# 我的代码有什么问题吗? 你能给点建议吗?


App.js(父级)

export default class App extends Component<{}> {

  constructor(props) {
    super(props);

    this.state = {
      head: [],
      list: [],
    };
  }

  _onPress = (text) => {
    const list = [].concat(this.state.list);

   list.push({
      key: Date.now(),
      text: text,
      done: false,
      mainuser: this.state.head,
    });

    this.setState({
      list,
    });
  }

  render() {
    const {
      head,
      list,
    } = this.state;

    var data = [["User1", "User2", "User3"],];

    return (
      <View style={styles.container}>
        <View style={styles.dropdownHeader}>
        <View style={styles.dropdown}>
          <DropdownMenu
            style={{flex: 1}}
            bgColor={'white'}
            tintColor={'#666666'}
            activityTintColor={'green'}
            handler={(selection, row) => this.setState({head: data[selection][row]})}
            data={data}
          >
          </DropdownMenu>
        </View>
        </View>
      <Text>To Do</Text>
            <View style={styles.postinput}>
              <CommentInput onPress={this._onPress} />
            </View>
          </View>
          <View style={styles.CommentListContainer}>
            <FlatList
              /*inverted*/
              style={styles.CommentList}
              data={list}
              renderItem={({ item }) => <CommentItem {...item} /> }
            />
          </View>
    );
  }
}

CommentItem.js(child)

const CommentItem = (props) => {
  const {
    head,
    text,
    created,
    mainuser,
    subuser,
  } = props;


  return (
    <View style={styles.container}>
      <View style={styles.left}>
        <Text style={styles.text}>{text}</Text>
      </View>
      <View style={styles.function}>
        <Button {...mainuser} />
      </View>
    </View>
  );
}

Button.js(孩子的孩子)

export default class ApplauseButton extends Component {

  constructor(props) {
    super(props);
    this.state = {

    };
  }

  render() {
    const {
      mainuser,
    } = this.props;

    return (
      <View style={styles.container}>
        <Text>{mainuser}</Text>
      </View>
    );
  }
}

2 个答案:

答案 0 :(得分:3)

如果您要访问mainuser作为道具,则必须将其作为<Button mainuser={mainuser} />传递。

就目前而言,您spread正在mainuser的内容中。

答案 1 :(得分:0)

根据您的代码,看来主要用户是数组

this.state = {
  head: [],//array
  list: [],
};

....
list.push({
      key: Date.now(),
      text: text,
      done: false,
      mainuser: this.state.head,// main user should be array
});

所以您还需要在<Button />中输入道具名称

像这样

<Button mainuser={mainuser} />