React コンポーネントが 2 回レンダリングされるのはなぜですか? 質問する

React コンポーネントが 2 回レンダリングされるのはなぜですか? 質問する

React コンポーネントが 2 回レンダリングされる理由がわかりません。そのため、パラメータから電話番号を取得して状態に保存し、Firestore で検索できるようにしています。2 回レンダリングされることを除けば、すべて正常に動作しているようです... 1 回目は電話番号とゼロ ポイントをレンダリングします。2 回目はすべてのデータが正しく表示されます。誰か解決策を教えてもらえますか。

class Update extends Component {
constructor(props) {
    super(props);
    const { match } = this.props;
    this.state = {
        phoneNumber: match.params.phoneNumber,
        points: 0,
        error: ''
    }
}

getPoints = () => {
    firebase.auth().onAuthStateChanged((user) => {
        if(user) {
            const docRef = database.collection('users').doc(user.uid).collection('customers').doc(this.state.phoneNumber);
            docRef.get().then((doc) => {
                if (doc.exists) {
                const points = doc.data().points;
                this.setState(() => ({ points }));
                console.log(points);
                } else {
                // doc.data() will be undefined in this case
                console.log("No such document!");
                const error = 'This phone number is not registered yet...'
                this.setState(() => ({ error }));
                }
                }).catch(function(error) {
                console.log("Error getting document:", error);
                });
        } else {
            history.push('/')
        }
    });
}

componentDidMount() {
    if(this.state.phoneNumber) {
        this.getPoints();
    } else {
        return null;
    }
}

render() {
    return (
        <div>
            <div>
                <p>{this.state.phoneNumber} has {this.state.points} points...</p>
                <p>Would you like to redeem or add points?</p>
            </div>
            <div>
                <button>Redeem Points</button>
                <button>Add Points</button>
            </div>
        </div>
    );
  }
}

export default Update;

ベストアンサー1

アプリを Strict モードで実行しています。index.js に移動し、Strict モード タグをコメント化します。単一のレンダリングが見つかります。

これは、React.StrictMode の意図的な機能です。これは開発モードでのみ発生し、レンダリング フェーズでの偶発的な副作用を見つけるのに役立ちます。

ドキュメントより:

厳密モードでは副作用を自動的に検出することはできませんが、副作用をもう少し決定論的にすることで、副作用を見つけるのに役立ちます。これは、次の関数を意図的に 2 回呼び出すことによって行われます。...

^ この場合はrender関数です。

React.StrictMode の使用時に再レンダリングが発生する可能性がある原因についての公式ドキュメント:

https://reactjs.org/docs/strict-mode.html#予期しない副作用の検出

おすすめ記事