現在のプロジェクトで使用しているマテリアル UI トグル スイッチで問題が発生しています。コンポーネントがロードされるときに、コンソールに値を記録すると、初期値は正しいです。ただし、スイッチをクリックして「はい」から「いいえ」にすると、スイッチは正しく表示され、「いいえ」が選択されていることを示し、コンソールのログが再び開始されますが、値は「はい」のままです。スイッチをもう一度クリックして「いいえ」に戻そうとすると、トグルは反転せずに再レンダリングされ、コンソールのログが再び起動され、値が「いいえ」に更新されます。したがって、基本的には最初のクリックでスイッチが切り替わり、2 回目のクリックで値が切り替わります。以前に同じトグル スイッチを問題なく使用したことがありますが、クリックしたときにスイッチと値を反転させるには何を修正する必要があるか教えていただけますか?
入力変更の処理:
const handleInputChange = e => { const {名前, 値} = e.target; setValues({ ...値、 [名前]: ( typeof value === 'string' ? (value).replace(/ (?= )/g, '').trimStart() : value ) // 値が文字列の場合、先頭のスペースと複数のスペースを削除します }); };
次のフォームから呼び出されるスイッチ:
ToggleSwitch コンポーネント:
import * as React from 'react'; import {ボックス、スイッチ、タイポグラフィ} から '@material-ui/core'; デフォルト関数のエクスポート ToggleSwitch(props) { const {ラベル1、ラベル2、名前、onChange、値} = props; const [チェック済み、setChecked] = React.useState(false); const ConvertToEventParams = (名前, 値) => ({ ターゲット: { 名前, 値 } }); const curValue = 値 === 1 ? true : false; const handleSwitch = e => { setChecked(e.target.checked); }; React.useEffect(() => { setChecked(curValue); }, [curValue]); // チェックされた値が変更されるたびにトグル スイッチを再レンダリングします const handleChecked = e => { ハンドルスイッチ(e); onChange(convertToEventParams(name, (checked === false ? 1 : 0))); // True/False を 1/0 の値に変換します }; 戻る ( <ボックス> <タイポグラフィー> {ラベル1} { <スイッチ 名前="{名前}" チェック済み="{チェック済み}" 値="{チェック済み}" onChange="{ハンドルチェック済み}" inputProps="{{'aria-label':" 'スイッチ'}}>スイッチ>} {ラベル2} タイポグラフィ> ボックス> ); }ボックス>
ToggleSwitch コンポーネントで状態と選択された値を処理しています。ローカル状態 (チェック済み) とプロパティ (値) の両方があり、それらを同期したいとします。
この問題を解決するには、スイッチと値が適切に同期されていることを確認してください
親コンポーネントから値プロパティを渡しているので、そのプロパティを直接使用してスイッチの状態を決定できます。 不要な状態や効果を削除することで、コンポーネント コードを簡素化できます。
値プロパティを直接使用してスイッチの初期状態を決定し、onChange 関数を使用して親コンポーネントを更新できます。
リーリー