React获取form表单值的N种方式

Ref模式(非受控模式)

非钩子模式
javascript 复制代码
1.createRef()方式
js:
userNameEl=createRef()
<input type="text" name="userName" ref={this.userNameEl} />
获取值的方式:
this.userNameEl.current.value

2.refs(废弃)
js:
const { userName } = this.refs;

<input type="text" name="userName" ref="userName" />

3.回调函数方式(不推荐)
js:
this.userNameRef.value
<input type="text" name="userName" ref={(el) => (this.userNameRef = el)} />
钩子函数模式
javascript 复制代码
import React, { useRef, useEffect } from 'react';
function MyComponent() {
  const myRef = useRef();
  useEffect(() => {
    myRef.current.focus();
  }, []);
  return <input ref={myRef} />;
}

非ref模式(受控模式)

非钩子模式
javascript 复制代码
import { Component } from "react";
export default class TestValue extends Component {
  state = {
    userName: null,
  };
  inputChange = (e) => {
    this.setState({ userName: e.target.value });
  };
  getInputValue = () => {
    console.log(this.state.userName);
  };
  render() {
    return (
      <div>
        <input type="text" name="userName" onChange={this.inputChange} />
        <button onClick={this.getInputValue}>TestValue</button>
      </div>
    );
  }
}
钩子模式
javascript 复制代码
import { useState } from "react";
export default function TestValue() {
  //函数式组件使用
  const [userName, setUserName] = useState(null);

  function inputChange(e) {
    setUserName(e.target.value);
  }
  function getInputValue() {
    console.log(userName);
  }
  return (
    <div>
      <input type="text" name="userName" onChange={inputChange} />
      <button onClick={getInputValue}>TestValue</button>
    </div>
  );
}

总结

ref模式和非ref模式的区别

ref模式是在类组件或使用Hooks的函数组件中创建并使用ref的方式,可以用来访问和控制DOM节点或其他组件实例。非ref模式主要是指无状态组件,它们不支持ref。

受控组件和非受控组件的区别

React受控组件和非受控组件之间的最大区别是组件的值是由React状态控制还是由DOM节点控制。

相关推荐
fishmemory7sec1 分钟前
Electron 主进程与渲染进程、预加载preload.js
前端·javascript·electron
fishmemory7sec4 分钟前
Electron 使⽤ electron-builder 打包应用
前端·javascript·electron
豆豆1 小时前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
JUNAI_Strive_ving1 小时前
番茄小说逆向爬取
javascript·python
看到请催我学习1 小时前
如何实现两个标签页之间的通信
javascript·css·typescript·node.js·html5
twins35202 小时前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky2 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~2 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
哪 吒2 小时前
华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)
javascript·python·华为od
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺