Reactjs更改另一个子组件的状态

时间:2017-12-16 11:30:15

标签: javascript reactjs react-native

我的父班有两个孩子     

计数器组件具有状态'计数器'以第二个递增;

class Counter extends Component {

    constructor(props) {
        super(props)
        this.resetCount = this.resetCount.bind(this);
        this.state = {
            count : 0
        }
    }

    resetCount() {
        this.setState({
            count : 0
        });
    }

    componentDidMount() {
        setInterval(() => {
            this.setState({
                count: this.state.count + 1
            });
        }, 1000);
    }

    render() {
        const {count} = this.state;
        const {color,size} = this.props;
        return (
            <Text style={{color, fontSize: size}}>{count}</Text>    

            );
    }
}

在按钮组件中,我有一个onpress的东西

  <Button
      onPress={resetCount}
      title="Reset COunt"
      color="#841584"         
    />

在我的主要父类我渲染

 <Counter color={'green'} size={90} />
    <Button/>

但是我收到了错误 &#39;无法找到变量resetCount&#39;在App.js

3 个答案:

答案 0 :(得分:0)

你必须使用&#39; this.resetCount&#39;当使用&#39; Button&#39;在Counter.render()

 <Button
  onPress={this.resetCount}
  title="Reset COunt"
  color="#841584"         
/>

如果Button是你自己提到的Component,你必须继承onPress函数

组件按钮

<Button onPress={this.props.onResetCount} ... />

组件计数器

render(){
   return (
            <Text style={{color, fontSize: size}}>{count}</Text>    
            <Button onResetCount={this.resetCount} title="Reset Count" color="... />
            );
   )
}

更详细:https://reactjs.org/docs/faq-functions.html

答案 1 :(得分:0)

这是因为Button无法访问其兄弟Counter组件中的类方法。如果通过将共享方法移动到父组件来重新组织代码,您可以a)实现您想要的,并且b)使您的代码更简单一些。换句话说,使Counter成为由两个较小的哑组件/纯函数组成的主要组件。

// No need for a component, just a function that returns
// a styled div
function Text({ count }) {
  return <div>{count}</div>;
}

// Another function to return a button
function Button({ resetCount, text }) {
  return <button onClick={resetCount}>{text}</button>;
}

// The main component that keeps the state which it passes
// to the dumb Text component
class Counter extends React.Component {

  constructor() {
    super()
    this.state = { count: 0 };
    this.resetCount = this.resetCount.bind(this);
  }

  componentDidMount() {
    setInterval(() => {
      this.setState({
        count: this.state.count + 1
      });
    }, 1000);
  }

  resetCount() {
    this.setState({ count: 0 });
  }

  render() {
    return (
      <div>
        <Text count={this.state.count} />
        <Button resetCount={this.resetCount} text="Reset count" />
      </div>
    )
  }
}


ReactDOM.render(
  <Counter />,
  document.getElementById('container')
);

<强> DEMO

答案 2 :(得分:0)

您收到错误是因为您无法以onPress={resetCount}方式执行此操作。它正在搜索变量。但是你没有变量,它是一个功能。因此,如果要访问函数this.resetCount,则应使用resetCount()

以下是如何从子组件中的按钮访问父组件的功能的示例:

// Parent component:
resetCount() {
  // your code
}
render() {
  return(
    <Button resetCount={this.resetCount} /* your other stuff */ />
  );
}

// Button component:
<button onPress={this.props.resetCount}>Click me</button>

注意:您无法通过这种方式更新兄弟姐妹。您应该将函数从<Counter/>移动到父组件。