<body>
<div id="root">
</div>
<script type="text/babel">
class Count extends React.Component {
constructor (props) {
super(props);
this.state = {count: 0};
this.props = {increment: 3};
}
increase() {
this.setState((state, props) => ({
count: state.count props.increment
}));
}
componentDidMount() {
this.intervalId = setInterval(() => this.increase(), 1000);
}
componentWillUnmount() {
clearInterval(this.intervalId);
}
render() {
return (
<h1>Counting: {this.state.count}</h1>
);
}
}
ReactDOM.render (
<Count />,
document.getElementById('root')
);
</script>
</body>
I'm getting "Counting: 0", then "Counting: NaN" after a second. Shouldn't it be increasing by 3 after every second?
I'm also getting the following warning:
"Warning: Count(...): When calling super() in Count, make sure to pass up the same props that your component's constructor was passed."
Why? I'm passing the same props to the super().
CodePudding user response:
By doing
this.props = {increment: 3};
you're confusing React.
Props should not be assigned inside a component. Props should only be passed down from the caller. Either remove that line and do
<Count increment={3} />
or put increment into state instead.
class Count extends React.Component {
state = { count: 0 };
increase() {
this.setState((state, props) => ({
count: state.count props.increment
}));
}
componentDidMount() {
this.intervalId = setInterval(() => this.increase(), 1000);
}
componentWillUnmount() {
clearInterval(this.intervalId);
}
render() {
return (
<h1>Counting: {this.state.count}</h1>
);
}
}
ReactDOM.createRoot(document.querySelector('.react')).render(<Count increment={3} />);
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div class='react'></div>
class Count extends React.Component {
state = { count: 0, increment: 3 };
increase() {
this.setState((state, props) => ({
count: state.count state.increment
}));
}
componentDidMount() {
this.intervalId = setInterval(() => this.increase(), 1000);
}
componentWillUnmount() {
clearInterval(this.intervalId);
}
render() {
return (
<h1>Counting: {this.state.count}</h1>
);
}
}
ReactDOM.createRoot(document.querySelector('.react')).render(<Count />);
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div class='react'></div>
