[解決済み] Reactでステートレスコンポーネントのrefにアタッチするにはどうすればよいですか?
2023-05-31 07:05:04
質問
ステートレス・コンポーネントを作成しようとしています。
input
要素が親コンポーネントによって検証されます。
以下の例では、入力の
ref
が親のプライベートな
_emailAddress
プロパティに割り当てられることはありません。
いつ
handleSubmit
が呼び出されます。
this._emailAddress
は
undefined
. 何か見落としているのか、それとももっと良い方法があるのでしょうか?
interface FormTestState {
errors: string;
}
class FormTest extends React.Component<void, FormTestState> {
componentWillMount() {
this.setState({ errors: '' });
}
render(): JSX.Element {
return (
<main role='main' className='about_us'>
<form onSubmit={this._handleSubmit.bind(this)}>
<TextInput
label='email'
inputName='txtInput'
ariaLabel='email'
validation={this.state.errors}
ref={r => this._emailAddress = r}
/>
<button type='submit'>submit</button>
</form>
</main>
);
}
private _emailAddress: HTMLInputElement;
private _handleSubmit(event: Event): void {
event.preventDefault();
// this._emailAddress is undefined
if (!Validators.isEmail(this._emailAddress.value)) {
this.setState({ errors: 'Please enter an email address.' });
} else {
this.setState({ errors: 'All Good.' });
}
}
}
const TextInput = ({ label, inputName, ariaLabel, validation, ref }: { label: string; inputName: string; ariaLabel: string; validation?: string; ref: (ref: HTMLInputElement) => void }) => (
<div>
<label htmlFor='txt_register_first_name'>
{ label }
</label>
<input type='text' id={inputName} name={inputName} className='input ' aria-label={ariaLabel} ref={ref} />
<div className='input_validation'>
<span>{validation}</span>
</div>
</div>
);
どのように解決するのですか?
編集:あなたは今、React Hooksを使用することができます。Ante Gulinの回答を参照してください。
Reactライクなメソッド(例えば
componentDidMount
,
componentWillReceiveProps
など) を含むステートレス・コンポーネントに
refs
.
GH でのこのディスカッションをチェックアウトする
をご覧ください。
ステートレスの考え方は、そのためのインスタンス(状態)が作成されないということです。そのため
ref
というように、refをアタッチするステートがないためです。
最善の策は、コンポーネントが変更されたときのコールバックを渡し、そのテキストを親のステートに割り当てることでしょう。
または、ステートレス・コンポーネントを完全に見送って、通常のクラス・コンポーネントを使用することもできます。
<ブロッククオート関数型コンポーネントはインスタンスを持たないので、ref属性を使用することはできません。しかし、機能コンポーネントの render 関数内部で ref 属性を使用することはできます。
function CustomTextInput(props) {
// textInput must be declared here so the ref callback can refer to it
let textInput = null;
function handleClick() {
textInput.focus();
}
return (
<div>
<input
type="text"
ref={(input) => { textInput = input; }} />
<input
type="button"
value="Focus the text input"
onClick={handleClick}
/>
</div>
);
}
関連
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
-
[解決済み] Reactコンポーネントに条件付きで属性を追加するにはどうすればよいですか?
-
[解決済み] コンポーネントテンプレートで要素を選択するには?
-
[解決済み] useEffect React Hook使用時の依存性欠如の警告を修正する方法
-
[解決済み] Reactでネストした状態のプロパティを更新する方法
-
[解決済み] Reactで親の状態を更新するにはどうしたらいいですか?
-
[解決済み] React HooksでcomponentWillMount()を使用するには?
-
[解決済み】あるリアクトコンポーネントを別のリアクトコンポーネントに渡して、最初のコンポーネントの内容をトランスクルードする方法は?
-
[解決済み】React.jsでコンポーネントのpropsを更新することは可能ですか?
-
[解決済み] TypeScriptでReactのステートレス機能コンポーネントを使用して子供を使用する方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React - 式は1つの親要素を持つ必要がありますか?
-
[解決済み】Reactでclsxを使用する方法
-
[解決済み】Warning.Itが表示されるのはなぜですか?Functions are not valid as a React child?
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] カスタマイズ素材UI チェックした場合としない場合の切り替え
-
[解決済み] eslint: no-case-declaration - case ブロックで予期しない字句の宣言があった。
-
[解決済み] validateDOMNesting警告React
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] React.jsのフォームコンポーネントでstateやrefsを使う?