カスタムコンポーネントクラスからredux-formに値を渡す方法は?

bluprince13

reduxフォームでカスタムコンポーネントを呼び出しています。

<Field name="myField" component={SiteProjectSelect}/>

このコンポーネントは、2つのコンボボックスの組み合わせです。2番目のボックスは、最初のボックスの値に依存します。つまり、選択したサイトに応じて、プロジェクトのリストから選択できます。私がやりたいのは、選択したサイトと選択したプロジェクトを受け取るためのフォームを取得することです。ただし、reduxフォームに値を渡す方法がわかりません。

class SiteProjectSelect extends Component {
    constructor() {
        super();
        this.state = {
            selectedSite: null,
            selectedProject: null,
        };
    }

    handleSiteSelection = selectedSite => {
        console.log(selectedSite)
        this.setState({ selectedSite, selectedProject: null });
    };

    handleProjectSelection = selectedProject => {
        this.setState({ selectedProject });
        this.props.input.onChange(selectedProject.value); 
    };

    render() {
        const selectedRow = this.state.selectedSite ? projects.find((node) => node.site === this.state.selectedSite.value) : "";
        const filteredProjectOptions =  selectedRow ? selectedRow.projects.map(project => ({ value: project, label: project })) : []

        return (
            <div {...this.props} >
                <label>Site</label>
                <div style={{ marginBottom: '20px' }} >
                    <Select
                        name="site"
                        value={this.state.selectedSite}
                        onChange={this.handleSiteSelection}
                        options={siteOptions}
                        isSearchable
                    />
                </div>
                <div style={{ marginBottom: '20px' }} >
                    <label>Project</label>
                    <Select
                        name="project"
                        value={this.state.selectedProject}
                        onChange={this.handleProjectSelection}
                        options={filteredProjectOptions}
                        isMulti
                        isSearchable
                        closeMenuOnSelect={false}
                    />
                </div>
            </div>
        );
    }
}
bluprince13

私はついにそれを理解しました。これに出くわした他の人のために、私が知る必要があることはここにあります。カスタムコンポーネントを使用するには、

  • onChange小道具を使用して、フィールドの新しい値を設定します。これを行うには、コンポーネントの値を変更して新しい値を渡す必要があるときにonChange関数を呼び出しthis.props.input.onChange(your-components-new-value-here)ます。
  • この新しい値は、valuepropに保存されますthis.props.input.valueしたがって、コンポーネントのレンダリング関数でコンポーネントの現在の値を渡す/表示する必要がある場合はvalue常にpropを使用してくださいこれはvalue小道具である必要があり、onChange関数に渡したものなどの別の変数であってはなりません。これが行うことは、あなたのredux-formの状態に表示されるものの制御を与えることです。value小道具はに結ばれています。なぜこれが便利なのですか?たとえば、ユーザーが完了したらフォームのレビューページに移動し、ユーザーがさらに変更を加えたい場合はフォームに戻ることができます。redux-formは、ユーザーがフォームに再度入力することなく、表示されているすべてのものを再入力する方法をどのように知るのでしょうか?表示は状態に依存するため、ユーザー入力ではありません。このすべてを理解するのに少し時間がかかりました!!

私の例ではreact-select、一方が他方に依存している2つのコンポーネントを使用していたため、フィールドコンポーネントを使用する必要があり、コンポーネントに1つだけでなく2つのフィールドを含めることができました。これを実装すると、両方のフィールドの値はvalueそれぞれの小道具を介して常にアクセスできるため、コンポーネント内に個別の状態を設定する必要がないことも明らかになりました。だから、はい、結局ステートレス関数を使用できたはずです!

コンポーネントを次のように呼び出します。

<Fields names={["site", "projects"]} component={SiteProjectSelect} />

私の最後の作業コンポーネント:

class SiteProjectSelect extends Component {
    handleSiteSelection = selectedSite => {
        this.props.site.input.onChange(selectedSite);
        this.props.projects.input.onChange(null);
    };

    handleProjectSelection = selectedProjects => {
        this.props.projects.input.onChange(selectedProjects);
    };

    renderSite = () => {
        const {
            input: { value },
            meta: { error, touched }
        } = this.props.site;

        return (
            <div>
                <label>Site</label>
                <div style={{ marginBottom: '20px' }}>
                    <Select
                        name="site"
                        value={value}
                        onChange={this.handleSiteSelection}
                        options={siteOptions}
                        isSearchable
                    />
                </div>
                <div className="red-text" style={{ marginBottom: '20px' }}>
                    {touched && error}
                </div>
            </div>
        );
    };

    renderProjects = () => {
        var {
            input: { value },
            meta: { error, touched }
        } = this.props.projects;

        const selectedSite = this.props.site.input.value;

        const selectedRow = selectedSite
            ? projects.find(node => node.site === selectedSite.value)
            : '';
        const filteredProjectOptions = selectedRow
            ? selectedRow.projects.map(project => ({
                    value: project,
                    label: project
              }))
            : [];

        return (
            <div>
                <div style={{ marginBottom: '20px' }}>
                    <label>Projects</label>
                    <Select
                        name="projects"
                        value={value}
                        onChange={this.handleProjectSelection}
                        options={filteredProjectOptions}
                        isMulti
                        isSearchable
                        closeMenuOnSelect={false}
                    />
                </div>
                <div className="red-text" style={{ marginBottom: '20px' }}>
                    {touched && error}
                </div>
            </div>
        );
    };

    render() {
        return (
            <div>
                {this.renderSite()}
                {this.renderProjects()}
            </div>
        );
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

コンポーネントからAngularサービス、カスタムクラスを初期化する方法は?

分類Dev

角度コンポーネントでカスタムTypeScriptクラスを使用する方法がわからない

分類Dev

コンポーネントからReduxフォームに値を渡す方法

分類Dev

Svelteコンポーネントから個別のカスタム要素をエクスポートする

分類Dev

子機能コンポーネントから親クラスコンポーネントに値を渡す方法は?

分類Dev

コンポーネントからReduxストアに値を渡す

分類Dev

redux形式でカスタムコンポーネントを使用する方法は?

分類Dev

AngularのカスタムフォームコンポーネントからFormControlにアクセスします

分類Dev

AngularのカスタムフォームコンポーネントからFormControlにアクセスします

分類Dev

onPressをカスタムコンポーネントに渡し、値を呼び出し元のコンポーネントに戻す方法は?

分類Dev

React Nativeのコンポーネントクラスからステートレスクラスに関数とデータを渡す方法は?

分類Dev

カスタムサーバーからNextJSのコンポーネントに変数を渡す

分類Dev

角度コンポーネントはカスタム要素(Webコンポーネントテクノロジーから)と同じですか?

分類Dev

機能コンポーネントからクラスコンポーネントにデータを渡す方法

分類Dev

エラーは、コンポーネントが定義されているファイルからコンポーネントをエクスポートするのを忘れたが、カスタムコンポーネントをエクスポートしていないことを示していました(React)

分類Dev

カスタムコンポーネントをCakephpMiddleWareクラスにインポートするにはどうすればよいですか?

分類Dev

カスタム認証プロバイダーからコントローラーにカスタム オブジェクトを渡す方法は?

分類Dev

カスタムクラスコンポーネントのスタイルでテーマを使用する方法

分類Dev

NPM経由で配布しながらReactコンポーネント(Redux、CSS)のカスタムアスペクトを管理する方法

分類Dev

カスタムreactナビゲーションヘッダーコンポーネントから親の状態値にアクセスする方法

分類Dev

カスタムデータ属性の小道具を子コンポーネントに適切に渡す方法は?

分類Dev

Antdフォーム、カスタムコンポーネントから値を取得しますか?

分類Dev

親のコンストラクターに注入されたサービスから受け取った値を子コンポーネントに渡す

分類Dev

スタイル付きコンポーネントは、一部の値のみをカスタムコンポーネントに渡します

分類Dev

オプションをカスタムvueコンポーネントに渡す方法は?

分類Dev

JSFカスタムコンポーネントからの検証メッセージを渡す

分類Dev

カスタムReactコンポーネントライブラリからコンポーネントをインポートして使用すると、不変の違反が発生します:無効なフック呼び出し

分類Dev

機能コンポーネントのスタイル付きコンポーネントにカスタム属性を渡す方法は?

分類Dev

角度2の親コンポーネントを介してカスタム(html)テンプレートを子コンポーネントに渡す方法は?

Related 関連記事

  1. 1

    コンポーネントからAngularサービス、カスタムクラスを初期化する方法は?

  2. 2

    角度コンポーネントでカスタムTypeScriptクラスを使用する方法がわからない

  3. 3

    コンポーネントからReduxフォームに値を渡す方法

  4. 4

    Svelteコンポーネントから個別のカスタム要素をエクスポートする

  5. 5

    子機能コンポーネントから親クラスコンポーネントに値を渡す方法は?

  6. 6

    コンポーネントからReduxストアに値を渡す

  7. 7

    redux形式でカスタムコンポーネントを使用する方法は?

  8. 8

    AngularのカスタムフォームコンポーネントからFormControlにアクセスします

  9. 9

    AngularのカスタムフォームコンポーネントからFormControlにアクセスします

  10. 10

    onPressをカスタムコンポーネントに渡し、値を呼び出し元のコンポーネントに戻す方法は?

  11. 11

    React Nativeのコンポーネントクラスからステートレスクラスに関数とデータを渡す方法は?

  12. 12

    カスタムサーバーからNextJSのコンポーネントに変数を渡す

  13. 13

    角度コンポーネントはカスタム要素(Webコンポーネントテクノロジーから)と同じですか?

  14. 14

    機能コンポーネントからクラスコンポーネントにデータを渡す方法

  15. 15

    エラーは、コンポーネントが定義されているファイルからコンポーネントをエクスポートするのを忘れたが、カスタムコンポーネントをエクスポートしていないことを示していました(React)

  16. 16

    カスタムコンポーネントをCakephpMiddleWareクラスにインポートするにはどうすればよいですか?

  17. 17

    カスタム認証プロバイダーからコントローラーにカスタム オブジェクトを渡す方法は?

  18. 18

    カスタムクラスコンポーネントのスタイルでテーマを使用する方法

  19. 19

    NPM経由で配布しながらReactコンポーネント(Redux、CSS)のカスタムアスペクトを管理する方法

  20. 20

    カスタムreactナビゲーションヘッダーコンポーネントから親の状態値にアクセスする方法

  21. 21

    カスタムデータ属性の小道具を子コンポーネントに適切に渡す方法は?

  22. 22

    Antdフォーム、カスタムコンポーネントから値を取得しますか?

  23. 23

    親のコンストラクターに注入されたサービスから受け取った値を子コンポーネントに渡す

  24. 24

    スタイル付きコンポーネントは、一部の値のみをカスタムコンポーネントに渡します

  25. 25

    オプションをカスタムvueコンポーネントに渡す方法は?

  26. 26

    JSFカスタムコンポーネントからの検証メッセージを渡す

  27. 27

    カスタムReactコンポーネントライブラリからコンポーネントをインポートして使用すると、不変の違反が発生します:無効なフック呼び出し

  28. 28

    機能コンポーネントのスタイル付きコンポーネントにカスタム属性を渡す方法は?

  29. 29

    角度2の親コンポーネントを介してカスタム(html)テンプレートを子コンポーネントに渡す方法は?

ホットタグ

アーカイブ