私はredux-form(素晴らしいライブラリ)を使用してフォームを処理しています&reduxReactアプリに保存します。重要なフォームとネストされたjson出力など、すべてがうまく機能します。
React-Semantic-UIコンポーネントとredux-formを使用しようとしています-)。私はドキュメント内でカスタムコンポーネントをreduxフォームと統合する方法を検索しました、そしてここに行きます: http://redux-form.com/6.5.0/docs/faq/CustomComponent.md/ 完璧なようです。
しかし、私がセマンティックとこれを統合すると、それは機能しません。
これは、擬似コードを使用した私の簡単なテストです。
const TestComponent = props => (
<Form>
<Field name="dropdownTest" component={ TestSelect } />
</Form>
)
ここでは、ドロップダウンを使用したCustomComponentを使用しています。ドロップダウンのドキュメントと小道具(onChangeとvalue)はここにあります:
http://react.semantic-ui.com/modules/dropdown
import Form , Dropdown from 'semantic-ui-react'
import {myOption from './myOption'
const TestSelect = field = (
<Form.Field>
<label> Test dropdown </label>
<Dropdown option={myOption} selection
value={{val : field.input.value}}
onChange={ param => field.input.onChange(param.val)} />
</Form.Field>
)
ドキュメントのように、カスタムコンポーネントにvalue&onChange小道具を追加しました。
私は明らかにここで何かが恋しいです。誰かがredux-formとsemantcuiの簡単な例を持っていますか?
助けてくれてありがとう。
成功しました:
Reactセマンティックドロップダウンを使用するには、これは簡単な例です:
const TestComponent = props => (
<Form>
<Field name="dropdownName" component={ DropdownFormField}
label="Dropdown Test"
/>
</Form>
)
const DropdownFormField = props => (
<Form.Field>
<Dropdown selection {...props.input}
value={props.input.value}
onChange={(param,data) => props.input.onChange(data.value)}
placeholder={props.label}
/>
</Form.Field>
)
そして、すべてがうまく機能しています。セマンティックおよび任意のコンポーネントでも同じことができます。
誰かがこれが役に立つと思ったことを願っています。
私の場合、受け入れられた回答が機能していないことがわかりました。reduxフォームはFOCUS
アクションを実行し続け、再レンダリングをトリガーし続け、ドロップダウンフィールドが開きませんでした。おそらく私の悪い、またはアップデートですが、デバッグする時間がなかったので、この解決策を思いつきました。
TypeScriptを使用しており、セマンティックUIドロップダウンフィールドをカスタムコンポーネントでラップして、reduxフォームからドロップダウン値を直接追加および取得します。
これまでのところうまく機能し、VanillaJSに簡単に移植できるはずです。
ReduxFormSemanticDropdownComponent
TypeScriptを使用する場合は、AppState
を独自の状態オブジェクトタイプに変更します。
import { DropdownProps, Dropdown, Form, DropdownItemProps } from "semantic-ui-react";
import * as React from "react";
import { Dispatch } from "redux";
import { AppState } from "../../..";
import { change, formValueSelector } from "redux-form";
import { connect } from "react-redux";
interface OwnProps {
name: string;
form: string;
label: string;
placeholder?: string;
options: Array<DropdownItemProps>;
}
interface DispatchProps {
change: (form: string, field: string, value: string) => void;
}
interface StateProps {
selectedValue: any;
}
type Props = OwnProps & DispatchProps & StateProps;
class ReduxFormSemanticDropdownComponent extends React.Component<Props> {
onChange = (value: string) => {
this.props.change(this.props.form, this.props.name, value);
}
render() {
return (
<Form.Field>
<label>{this.props.label}</label>
<Dropdown
placeholder={this.props.placeholder}
fluid
selection
value={this.props.selectedValue}
onChange={(event: React.SyntheticEvent<HTMLElement>, data: DropdownProps) => this.onChange(data.value as string)}
options={this.props.options}
/>
</Form.Field>
)
}
}
const mapDispatchToProps = (dispatch: Dispatch<AppState>): DispatchProps => {
return {
change: (form: string, field: string, value: string) => dispatch(change(form, field, value)),
};
};
const mapStateToProps = (state: AppState, ownProps: OwnProps): StateProps => {
var selector = formValueSelector(ownProps.form);
return {
selectedValue: selector(state, ownProps.name)
}
}
export const ReduxFormSemanticDropdown = connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(ReduxFormSemanticDropdownComponent);
使用する
これを通常のreduxフォームに追加すると、標準フィールドと同じように動作するはずです。
<ReduxFormSemanticDropdown
name="gigType"
form="applicationForm"
label="Gig Type"
options={[
{
text: `I'm flexible!`,
value: 'Flexible',
},
{
text: 'Mid Week (Evening)',
value: 'MidWeekEvening',
},
{
text: 'Weekend (Afternoon)',
value: 'WeekendAfternoon',
},
{
text: 'Weekend (Evening)',
value: 'WeekendEvening',
}
]}
/>