September 28, 2018
material-uiとformikを苦労なくつなぎこみたい場合、以下のモジュールがあります。
https://github.com/stackworx/formik-material-ui
ただ2018/09の時点ではcheckboxの振る舞いで初期値にチェックがつけることができなそうです。
手元では修正しましたのでここに載せておきます。
Before: 2018/09の時点でのソース
// @ts-ignore | |
import * as React from 'react'; | |
import MuiCheckbox, { | |
CheckboxProps as MuiCheckboxProps, | |
} from '@material-ui/core/Checkbox'; | |
import { FieldProps } from 'formik'; | |
import { Omit } from './types'; | |
export interface CheckboxProps | |
extends FieldProps, | |
Omit<MuiCheckboxProps, 'form'> {} | |
const Checkbox: React.ComponentType<CheckboxProps> = ({ | |
field, | |
form: { isSubmitting }, | |
disabled = false, | |
...props | |
}) => ( | |
<MuiCheckbox | |
disabled={isSubmitting || disabled} | |
{...props} | |
{...field} | |
// TODO: is this the correct way? | |
value={field.value ? 'checked' : ''} | |
/> | |
); | |
Checkbox.displayName = 'FormikMaterialUICheckbox'; | |
export default Checkbox; |
After: 修正したファイル
import MuiCheckbox from '@material-ui/core/Checkbox' | |
const Checkbox = ({ | |
field, | |
form: { isSubmitting }, | |
disabled = false, | |
...props | |
}) => { | |
return ( | |
<MuiCheckbox | |
disabled={isSubmitting || disabled} | |
{...props} | |
{...field} | |
checked={field.value == (props.value || "true") ? true : false} | |
value={props.value || "true"} | |
/> | |
)} | |
export default Checkbox |
使用例:
import FormControlLabel from '@material-ui/core/FormControlLabel' | |
import { Field } from 'formik' | |
import Checkbox from 'path/to/myCheckbox' | |
<FormControlLabel | |
label="ラベル" | |
control={ | |
<Field | |
name="anything" | |
component={Checkbox} | |
value="1" | |
/> | |
} | |
/> |
2018/10時点ではいつ取り込まれるのか分かりませんがPRがありますね。
https://github.com/stackworx/formik-material-ui/pull/27/files
const Checkbox: React.ComponentType<CheckboxProps> = ({ | |
field, | |
form: { isSubmitting }, | |
disabled = false, | |
LabelProps, | |
...props | |
}) => ( | |
<FormControlLabel | |
control={ | |
<MuiCheckbox | |
disabled={isSubmitting || disabled} | |
value={field.name} | |
checked={field.value} | |
{...props} | |
{...field} | |
/> | |
} | |
{...LabelProps} | |
/> | |
); |
FormControlLabel
が追加されていて、valueに field.name
が設定されていますね。
以下のようにfield.nameの値がPOSTされるような形なのでしょうか。
[
'someCheckboxFieldName' => 'someCheckboxFieldName'
]
どのような挙動になるか確かではありませんが、面白いですね。
以上です。
Written by Ta Toshio who lives and works in Saitama, Japan .You should follow him on Twitter