概要
有効/無効の 2 つの状態を持つ要素を利用して、createContext
で作成した状態を保持・切り替えさせたい。
Calcite Design System のCalciteSwitch
を利用し、状態をクリックで変更しようとしたが、実際はクリックをしても見た目が有効なまま変わらなかった。
意図した動作としては、選択状態に応じて下の表のようになる。
スイッチの状態 | 表示 |
---|---|
有効 | |
無効 |
環境
項目 | バージョン |
---|---|
@esri/calcite-components-react | 0.32.0 |
react | 18.2.0 |
原因・対策
onClick
でイベントの処理をしつつchecked={context.isSetAttr}
のようにchecked
プロパティで状態管理をすると適切に表示されなくなる。
checked=true
やchecked
であれば当然青になるが、checked=false
であっても表示が上の表の「有効」のものになる。
ドキュメントにはchecked
はtrue
, false
を持つとあるが、実際にはfalse
だと意図した通りの表示にならない。
下記コードでは状態に関わらず「有効」のものが表示される。
(context
は上位コンポーネントより渡しており、isSetAttr
はboolean
)
<CalciteSwitch
checked={context.isSetAttr}
onClick={(e) => {
const input = e.target as HTMLInputElement;
context.setIsSetAttr(input.checked);
}}
/>
正しくは下記のようにonCalciteSwitchChange
でイベントの処理をしつつ、checked
に状態を持たせない。
<CalciteSwitch
onCalciteSwitchChange={(e) => {
const input = e.target;
context.setIsSetAttr(input.checked);
}}
/>
Fires when the
checked
value has changed. Note: The event payload is deprecated, use the component'schecked
property instead.
Switch | Calcite Design System | ArcGIS Developers - (developers.arcgis.com)
これで意図した表示にはなるが、コンポーネント自体に状態を保持しておらず、複数箇所からの操作がある場合に若干不安がある。