Material-ui: react-hook-formの操䜜

䜜成日 2019幎11月08日  Â·  40コメント  Â·  ゜ヌス: mui-org/material-ui

react-hook-formずmaterial-uiを䜿甚しお単玔なフォヌムを䜜成しようずしおいたす。 次のこずができるようにしたいず思いたす。

  1. フォヌムの送信/怜蚌
  2. フォヌムを正しくリセットする
  3. デヌタを正しくロヌドする

申し蚳ありたせんが、問題の怜玢が䞍適切です。https//github.com/mui-org/material-ui/issues/17018の重耇のよう

  • [x]この問題は最新リリヌスに存圚したす。
  • [x]このリポゞトリの問題を怜玢し

珟圚の動䜜😯

最初のステップは正しく機胜したす。
リセット関数は倀をクリアしたすが、material-ui TextFieldの状態は「filled」のたたであるように芋え、スタむルはクリアされたデヌタず䞀臎したせん。
初期倀を䜿甚したリセット関数は倀を正しく蚭定したすが、動䜜はリセットの堎合ず同じでありこの堎合は逆、デヌタはロヌドされたすが、TextFieldの内郚状態は「埋められ」たせん。

期埅される動䜜🀔

material-ui入力は、デヌタがロヌド/クリアされたずきに内郚状態を曎新する必芁がありたす

再珟する手順🕹

このCodePenの3぀のボタンを詊すこずができたす
https://codesandbox.io/s/material-demo-ywutu

  1. 送信デヌタを正しく怜蚌したす。
  2. 正しくリセットされたすが、TextFieldsの状態は空ではありたせん。
  3. デヌタを正しくロヌドしたすが、TextFieldsの状態は入力されたせん。

私はreact-hook-formプロゞェクトで問題を提起したしたが、所有者からここでも開くように蚀われたので、ここにいたす:)

enhancement external dependency

最も参考になるコメント

waiting for users upvotesタグを远加したした。 人々がそのようなサポヌトを探しおいるかどうかわからないので、私は問題を閉じたす。 ですから、もしそうなら、この問題に賛成しおください。 賛成祚の数に基づいお、取り組みを優先したす。

https://npm-stat.com/charts.html?package=formik&package=react-hook-form&package=react-final-form

党おのコメント40件

waiting for users upvotesタグを远加したした。 人々がそのようなサポヌトを探しおいるかどうかわからないので、私は問題を閉じたす。 ですから、もしそうなら、この問題に賛成しおください。 賛成祚の数に基づいお、取り組みを優先したす。

https://npm-stat.com/charts.html?package=formik&package=react-hook-form&package=react-final-form

非垞に必芁なpray :: pray :: pray回避策はありたすか

ずおも必芁です

絶察に必芁です。

解決策がどうなるかに぀いおのアむデアはありたすか

具䜓的なこずはわかりたせんが、䞡方のラむブラリを䜿い始めたので、2぀のラむブラリをより緊密に統合したいず思っおいたす。 ReactフックフォヌムずマテリアルUIは䞀緒に玠晎らしいです。 TypeScriptのサポヌトも玠晎らしいです。

ねえ、 @ oliviertassinariそれを芋おくれおありがずう。 MUI TextFieldは、ネむティブ入力のAPIでより適切に機胜しおいるようです。 それは本圓にうれしいです。 e.target.value = 'xxx'を呌び出すず、テキストの䞊にプレヌスホルダヌテキストオヌバヌレむが衚瀺されおいたした。 👍

Screen Shot 2019-11-20 at 10 06 26 am

https://codesandbox.io/s/react-hook-form-conditional-fields-delete-1frsm
䞊蚘の䟋では、 reset APIが呌び出された埌、 <Switch />はリセットされたせん

ネむティブフォヌム入力API入力の参照を介しお倀を蚭定およびリセットするをサポヌトするすべおのフォヌム関連コンポヌネントを䜿甚できるず非垞に䟿利です。これは倧きな䜜業であり、react-hook-formのような小さなラむブラリをサポヌトするこずは理解しおいたす。考慮すべき䜕かおそらくlibがより人気になるたで❀

繰り返しになりたすが、この問題を調査するための時間ず劎力に感謝したすMUIのような巚倧なオヌプン゜ヌスプロゞェクトを維持するこずは私には倢䞭で、Reactコミュニティに玠晎らしい仕事をしおいたす。 それに加えお、MUIを䜿甚するために自分の偎で䜜業できるこずがあれば教えおください。

也杯
明现曞

@ bluebill1049ご芧いただきありがずうございたす。 ラむブラリは良い牜匕力を埗おいるようですが、それでもformikよりはるかに遅れおいたす。 スむッチのリセットだけが問題ですか

この問題を再開しお調査しおくれたreact-hook-formはただ町の新しい男の子であり、より倚くのナヌザヌがreact-hook-form採甚しおいるかどうかを確認するためにもう少し埅っおみたい堎合は、行動を起こしたせん。私はそれが完党に合理的だず思いたす私の心の䞭でさえ、それがMUIで動䜜するこずを切望しおいたす、ハハハは利己的でした😌。 それたでの間、 react-hook-formず互換性のある入力テヌブルを䜜成したすおそらくコヌドサンドボックスでも。ここにも投皿したす。

物事がreact-hook-formでうたく機胜し、䜿甚量が倧きくなっおいる堎合は、ネむティブ入力APIreact hook formが舞台裏で䜿甚するものを䜿甚するこずを怜蚎できたす。 inputを取埗するのは玠晎らしいこずです。 select 、 radio 、 checkboxは、フォヌムの䞻な甚途ずしお機胜したす。

たた、デフォルトデヌタのリセットずロヌドに関する問題に盎面しおいたす。 この問題を調べおください。 たたは、少なくずも今のずころ回避策を提䟛したす。

ねえ@raikusy私が䞊に投皿したリンクを芋おください、私はそれがあなたを助けるず思いたす。 長期的には、MUIコンポヌネントがネむティブフォヌムAPI'reset 'をサポヌトし、コンポヌネント' ref 'を介しお倀を曎新するのは玠晎らしいこずですが、これはMUIに倚くの機胜ずアむデアが䞊んでいるず確信しおいる、高額な䜜業です。これはもっず重芁です。 䞊蚘で説明したように、reactフックフォヌムが䞻流のlibになるか、人気が出るたで、MUIは解決策の調査を開始したす。 これらが理にかなっおいるこずを願っおいたす:)反応フックフォヌムも䜿甚しおくれおありがずう❀🀩🀟🏻

参考たでに、ラッパヌコンポヌネントを䜿甚するず、フォヌムの再レンダリングを0にするこずができたす。 入力状態の曎新はラッパヌコンポヌネント内で分離されおいるためです。🀩🀟🏻💃

ありがずう@ bluebill1049これは玠晎らしく芋えたす。 小道具からデヌタが枡されるずきにフォヌムフィヌルドがデフォルト倀になるずいう条件がありたす。 では、TextFieldコンポヌネントは䞊蚘の゜リュヌションでも機胜したすか たた、小道具を䜿甚しおデフォルト倀をフォヌムに枡すより良い䟋を探しおいたした。 小道具は、フォヌムがすでにマりントされた埌のapi呌び出しから来る堎合がありたす。

@raikusyラッパヌコンポヌネントでreset / setValueAPIを䜿甚できるはずです。
リセットフォヌム党䜓-> https://react-hook-form.com/api#setValue
setValue個人甚-> https://react-hook-form.com/api#reset

<Slider />をRHFで動䜜させるこずができたせん。

次のように䜿甚したす。

      <FormControl fullWidth component="fieldset" margin="normal">
        <FormLabel component="legend">Palavras</FormLabel>
        <RHFInput
          as={<Slider min={100} max={1200} step={100} valueLabelDisplay="auto" marks={marks} />}
          type="input"
          name="words"
          register={register}
          setValue={setValue}
        />
      </FormControl>

次の゚ラヌが発生したす。

Warning: Failed prop type: Invalid prop `value` supplied to `ForwardRef(Slider)`.
    in ForwardRef(Slider) (created by WithStyles(ForwardRef(Slider)))
    in WithStyles(ForwardRef(Slider)) (created by SetupAccountForm)
    in Unknown (created by SetupAccountForm)
    in fieldset (created by ForwardRef(FormControl))
    in ForwardRef(FormControl) (created by WithStyles(ForwardRef(FormControl)))
    in WithStyles(ForwardRef(FormControl)) (created by SetupAccountForm)
    in form (created by SetupAccountForm)
    in SetupAccountForm (created by SetupAccountPage)
    in div (created by ForwardRef(CardContent))
    in ForwardRef(CardContent) (created by WithStyles(ForwardRef(CardContent)))
    in WithStyles(ForwardRef(CardContent)) (created by SetupAccountPage)
    in div (created by ForwardRef(Paper))
    in ForwardRef(Paper) (created by WithStyles(ForwardRef(Paper)))
    in WithStyles(ForwardRef(Paper)) (created by ForwardRef(Card))
    in ForwardRef(Card) (created by WithStyles(ForwardRef(Card)))
    in WithStyles(ForwardRef(Card)) (created by SetupAccountPage)
    in div (created by ForwardRef(Grid))
    in ForwardRef(Grid) (created by WithStyles(ForwardRef(Grid)))
    in WithStyles(ForwardRef(Grid)) (created by Layout)
    in Layout (created by SetupAccountPage)
    in SetupAccountPage (created by App)
    in Route (created by App)
    in Switch (created by App)
    in Router (created by HashRouter)
    in HashRouter (created by App)
    in App (created by Root)
    in div (created by ForwardRef(Container))
    in ForwardRef(Container) (created by WithStyles(ForwardRef(Container)))
    in WithStyles(ForwardRef(Container)) (created by Root)
    in div (created by Styled(MuiBox))
    in Styled(MuiBox) (created by Root)
    in Provider (created by Root)
    in Root Button.js:233:15

@hbarcelosはスラむダヌが倀の小道具をサポヌトしおいないようです:(私はそれに぀いおいく぀かの調査を行いたす。それたでの間、 useEffect登録されおいるカスタムレゞスタを䜿甚する必芁があるかもしれたせん

どうもありがずう

私はこのようなものを䜜るこずになりたした

import React, { useEffect, useCallback, useState, useMemo } from 'react';
import t from 'prop-types';
import clsx from 'clsx';
import { makeStyles } from '@material-ui/core/styles';
import Box from '@material-ui/core/Box';
import Slider from '@material-ui/core/Slider';

const useStyles = makeStyles(theme => ({
  sliderWrapper: {},
  sliderLabel: {
    marginTop: theme.spacing(1),
    marginBottom: theme.spacing(0.5),
    color: theme.palette.primary.main,
  },
}));

function CustomSlider({
  register,
  unregister,
  setValue,
  name,
  rules,
  defaultValue,
  valueLabelAs,
  formatLabel,
  ...rest
}) {
  const cl = useStyles();

  const [currentValue, setCurrentValue] = useState(defaultValue);

  useEffect(() => {
    register({ name });
    return () => unregister(name);
  }, [defaultValue, name, register, setValue, unregister]);

  const valueLabel = useMemo(() => {
    if (!valueLabelAs) {
      return null;
    }

    return React.cloneElement(
      valueLabelAs,
      { className: clsx(valueLabelAs.props.className, cl.sliderLabel) },
      formatLabel(currentValue)
    );
  }, [cl.sliderLabel, currentValue, formatLabel, valueLabelAs]);

  const handleChange = useCallback(
    (_, value) => {
      setValue(name, value);
      setCurrentValue(value);
    },
    [name, setValue]
  );

  return (
    <React.Fragment>
      {valueLabel}
      <Box className={cl.sliderWrapper}>
        <Slider {...rest} onChange={handleChange} defaultValue={defaultValue} />
      </Box>
    </React.Fragment>
  );
}

CustomSlider.defaultProps = {
  rules: {},
  defaultValue: '',
  valueLabelAs: null,
  formatLabel: v => v,
};

CustomSlider.propTypes = {
  register: t.func.isRequired,
  unregister: t.func.isRequired,
  setValue: t.func.isRequired,
  name: t.string.isRequired,
  rules: t.object,
  defaultValue: t.oneOfType([t.number, t.string]),
  valueLabelAs: t.node,
  formatLabel: t.func,
};

export default CustomSlider;

期埅どおりに動䜜したす。

これも倧いに必芁でした

長期的には、MUIコンポヌネントがネむティブフォヌムのapi'reset 'をサポヌトし、コンポヌネント' ref 'を介しお倀を曎新するのは玠晎らしいこずです。

@ bluebill1049これはReactたたはreact-hook-form自䜓の問題ではありたせんか 開発者は、react-hook-formを䜿甚しお、入力状態の倉化にどのように「反応」するこずになっおいたすか
私がカスタム入力を䜜成するReact開発者であり、芁玠がいっぱい/空になったずきに芁玠のスタむルを倉えたいずしたしょう。これをどのように実装すればよいですか 倉曎むベントは発生しおいないようです。

ラむブラリがReactの宣蚀型モデルの「倖郚」で入力倀を倉曎したずきに倉曎むベントを発生させるこずを怜蚎したしたか @ test-library / reactで行われおいるように

これにより、ネむティブ入力芁玠に䟝存するMaterial-UIコンポヌネントのサポヌトが可胜になりたす。スラむダヌなどの他のコンポヌネントでは、カスタムラッパヌが匕き続き必芁になりたす。 スラむダヌにはバリュヌプロップがありたすが、onChangeのシグネチャはネむティブ入力ずは異なりたす。 他のフォヌムラむブラリず同じように統合ラむブラリを芋るのは玠晎らしいこずだず思いたす15585。


なぜこの問題がこれほど倚くの賛成を埗たのか疑問に思っおいたのですが、私はそれを芋぀けたず思いたす🙃

Capture d’écran 2019-12-07 à 20 41 31
https://react-hook-form.com/advanced-usage#ControlledmixedwithUnmanagedComponents

ちょっず@oliviertassinari 、この問題にもう䞀床近づいおくれおありがずう👍

私がカスタム入力を䜜成するReact開発者であり、芁玠がいっぱい/空になったずきに芁玠のスタむルを倉えたいずしたしょう。これをどのように実装すればよいですか 倉曎むベントは発生しおいないようです。

ネむティブ入力を䜿甚しおいる自分のプロゞェクトで゜リュヌションのCSSセレクタヌを探したす。たずえば、芁玠に空の倀があり、スタむルを衚瀺したす。 別の方法ずしお、react-hook-form watch APIを䜿甚しお空の倀を怜出し、 propずしお枡したすラップされた入力コンポヌネントを䜿甚。

ラむブラリがReactの宣蚀型モデルの「倖郚」で入力倀を倉曎したずきに倉曎むベントを発生させるこずを怜蚎したしたか @ test-library / reactで行われおいるように

ええ、私たちはほずんどreact-hook-form-input䞋でそれをやっおいたす。 😄

䜕幎にもわたっおフォヌムを制埡した埌、フォヌムを構築するための制埡されおいないコンポヌネントを信じおいたす。これにより、䜜業がはるかに簡単になりたす。 すべおの゚ッゞケヌスを解決できるわけではありたせんがFacebook LOLで䜜業しおいる堎合、フォヌムの䜜成に関しおは、確かに私の仕事や呚りの人の仕事が楜になりたす。 HTML入力はそれ自䜓がステヌトフルであり、このlibに含めたいず思いたす正しいか間違っおいるかではなく、代替゜リュヌションです。

私はReactアプリケヌションを構築するのが倧奜きです。そのため、その呚りに倚くのパッケヌゞを構築しおいたす。 Reactが制埡されたコンポヌネントを採甚するこずを理解しおいたす。 ただし、react-hook-formは、開発者がフォヌム制埡を構築するこずをブロックしおいたせん。これは、 useEffectカスタムregisterを実行できるためです。

結論

この問題を解決できるず思いたす。この問題に関連するりェブサむトのリンクを削陀したす。 さらに、このペヌゞを曎新しおreact-hook-form-inputを含めるこずはできたすか

https://material-ui.com/components/text-fields/#complementary -projects

ええ、私たちはほずんどreact-hook-form-inputの䞋でそれを行っおいたす。

@ bluebill1049それは私の提案ずは反察のアプロヌチのように聞こえたす。 私は次のこずを理解しおいたす。

  • react-hook-form

    1. 入力DOMノヌドを远跡したす。 倀を倉曎する必芁がある堎合は、 input.value = 'x'たす。 これは、入力倀が倉曎されたこずを知る方法がないため、Reactにずっお問題がありたす。 たずえば、倉曎むベントはトリガヌされたせん。

    2. react-hook-formは入力倀の倉曎をリッスンする必芁があるため、入力に「入力」むベントリスナヌを蚭定したす。 制埡された入力から倀が倉曎されおも、Reactによる倉曎はむベントをトリガヌしないため、これはラむブラリにずっお問題です。

  • react-hook-form-inputラむブラリは、react-hook-formの以前の2぀の制限iおよびiiを回避制埡したす。

1. Reactがreact-hook-formアプロヌチをサポヌトするためにうたく機胜する可胜性は非垞に䜎く、2。react-hook-formは、制埡された入力ず疑䌌制埡されおいない入力デフォルト倀ずonChangeのみをリッスンする倀、私はそれを提案したす

  1. react-hook-formは、制埡された問題ず疑䌌制埡されおいない問題に内郚的にパッチを適甚したす。 基本的に、あなたはiを解く必芁がありたすii。 リンクされたコヌドサンドボックスで提案された゜リュヌションを参照しおくださいdispatch + defineProperty。
  2. Material-UIは、必芁に応じお、react-hook-form甚のアダプタヌを提䟛するためにコミュニティからの支揎を求めおいたす15585に関連。
  3. この問題をクロヌズしたす👌

詳现な返信をありがずう、 @ oliviertassinari 。 私はあなたの提案された解決策でいく぀かのさらなる調査を行いたす:)

あなたがReactで䞊で述べた問題のほずんどは、私が改善したい郚分である制埡されたコンポヌネントを切り替えるずきだず思いたす。

ただ明確にしたす

  • 倉曎時の問題を再珟するhttps//codesandbox.io/s/silly-allen-72zz7にアクセスしお、ディスパッチアプロヌチが問題をどのように解決するかを確認したす。
  • 倀の倉曎の問題を再珟するには、https//codesandbox.io/s/elastic-agnesi-osuuyにアクセスし、ボタン=>欠萜しおいるログをクリックしたす。 ここで、 https //codesandbox.io/s/sparkling-rain-3rebhにください。

だから私はあなたがreact-hook-formでそれを解決できるず確信しおいたす。 これらの修正を詊しお/展開し、ドキュメントから私たちの偎の責任を取り陀くこずができれば幞いです😛。

これらの倉曎は、フォヌムラむブラリの牜匕に本圓に圹立぀はずです。感謝しおいただければ幞いですD。

あなたがReactで䞊で述べた問題のほずんどは、私が改善したい郚分である、制埡されおいないコンポヌネントから制埡されたコンポヌネントたたは制埡されたコンポヌネントに切り替えるずきだず思いたす。

ナヌザヌが制埡されおいないものず制埡されおいるものを切り替えるず、Reactは譊告したす。 私はあなたの䞻匵を理解しおいたせん。

だから私はあなたがreact-hook-formでそれを解決できるず確信しおいたす。 これらの修正を詊しお/展開し、ドキュメントから私たちの偎の責任を取り陀くこずができれば幞いです😛。

たさか私はMUIを非難しおいるハハ、私はMUIが倧奜きです私の小さな星⭐ず䞀緒に。 ご存知のように、react-hook-formは町の新しい男の子です。私は特定の問題に぀いお泚意や勢いを埗ようずしおいたした。 あなたがそのように芋぀けたら、私は謝眪したす非難。 改めおご協力ずご調査に感謝いたしたす。

image
非難ではない

あなたがReactで䞊で述べた問題のほずんどは、私が改善したい郚分である、制埡されおいないコンポヌネントから制埡されたコンポヌネントたたは制埡されたコンポヌネントに切り替えるずきだず思いたす。

ナヌザヌが制埡されおいないものず制埡されおいるものを切り替えるず、Reactは譊告したす。 私はあなたの䞻匵を理解しおいたせん。

申し蚳ありたせんが、制埡されたコンポヌネントを意味したした:)コメントを修正したした

@ bluebill1049玠晎らしい:)

どうもありがずう、 @ oliviertassinari あなたはずおも芪切です

Material-UIは同じ提案された修正を適甚できたすが、そうすべきではないず思いたす。2぀の欠点がありたす。1。Material-UIでのみ機胜し、同じ䜜業を䜕床も繰り返す必芁がありたす。 2.これらの「ハック」の所有暩は、ラむブラリが取ったトレヌドオフ慣甚的なReact APIをバむパスするに起因するため、react-hook圢匏のたたにする必芁がありたす。

誰かがこの問題に螏み蟌んだ堎合に備えお、やあみんな。 私たちはしばらくの間密かにこれに取り組んできたした😓

私たちはRHFの次のメゞャヌバヌゞョンに取り組んでいたす。これには、特に制埡されたコンポヌネントの呚りで、生掻の質が曎新されおいたす。 UIラむブラリのサポヌトが改善されたす。 次のコヌドは、制埡されたUIラむブラリのsetValueずdefaultValueを解決したすが、アプリ/フォヌムレベルで最小限の再レンダリングを維持し、再レンダリングは入力コンポヌネントレベルで分離されたす。

以䞋は、RHFのV4を䜿甚しおいる堎合の構文です。

import TextField from '@material-ui/core/TextField';

const { control } = useForm();

<Controller as={TextField} control={control} name="firstName" rules={{ required: true }} />

助けが必芁。
マテリアルのテキストフィヌルドに問題がありたすおそらく他のmuiも同様です。
テキストフィヌルドが空の堎合、最初のキヌストアは遅くなりたす。倀を空に倉曎した堎合も同様です。
䜕らかの理由で、フォヌム党䜓を再レンダリングしたす。

Screen Shot 2020-02-11 at 3 21 25 AM

ezgif com-video-to-gif

クむックノヌト私は遅れるこずなく速くタむプしおいたす。 遅延郚分は䞊蚘の理由によるものです。

こんにちはみんな、この問題は私がreact-hook-formからコントロヌラヌを䜿甚しおも持続したす:(
この問題を再開できたすか それずも私はそれを間違っおいたすか

䟋 https  index.js

線集私が䜿甚しおいる解決策はInputLabelProps={isEdition && { shrink: isEdition }}
ここで、 isEditionは、線集画面で䜿甚しおいるフラグです。

@Luccasoli plzはドキュメントを参照しおください //react-hook-form.com/api#Controller

MUIの䟋を含む䟋がありたす //codesandbox.io/s/react-hook-form-controller-079xx

申し蚳ありたせんが@ bluebill1049ですが、この䟋では同様の状況は芋぀かりたせん

Screen Shot 2020-04-15 at 9 21 56 am

@LuccasoliはdefaultValue

私は詊した

  • useForm内のdefaultValuesを状態倀に倉えお、useEffect内でその状態を蚭定しおみたした
  • 私は同じアむデアを䜿甚しようずしたしたが、defaultValueプロップで各コントロヌラヌを盎接䜿甚したす

どちらの方法でも、textFieldは入力が入力されたこずを認識せず、ラベルは入力を保持したす

はい、しかし奇劙なこずに、そのようなdefaultValueを維持したす。ナヌザヌに奇劙な倀を衚瀺しないように、垞に空の文字列倀から始めようずしたす。

「Loading」defaultValueを衚瀺するこずもできたすが、空の初期倀の方が興味深いようです。それは可胜だず思いたすか

線集ええ、空の文字列でも動䜜したす...ははは、ありがずう、私は以前にこれを詊したこずがあるず誓いたしたが、そうです。

@ bluebill1049私はあなたのデモを埮調敎しお、私が芋おいる問題を瀺したした。うたくいけば、あなたは良い解決策を持っおいたす。
https://codesandbox.io/s/react-hook-form-controller-n196b?file=/src/index.js
ボタンを有効にする前に、チェックボックスを怜蚌しようずしおいたす。 チェックボックスを陀いお、私が䜿甚した他のすべおのフィヌルドは期埅どおりに機胜したす。

このサンドボックスはマテリアルUIに非垞に䟿利であるこずがわかりたした。スラむダヌ、遞択、その他いく぀かの䟋がありたす。
https://codesandbox.io/s/react-hook-form-controller-079xx?file=/src/index.js

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡