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节点控制。

相关推荐
狗头大军之江苏分军1 天前
iPhone 17 vs iPhone 17 Pro:到底差在哪?买前别被忽悠了
前端
小林coding1 天前
再也不怕面试了!程序员 AI 面试练习神器终于上线了
前端·后端·面试
文心快码BaiduComate1 天前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员
babytiger1 天前
python 通过selenium调用chrome浏览器
前端·chrome
passer9811 天前
基于webpack的场景解决
前端·webpack
华科云商xiao徐1 天前
Java并发编程常见“坑”与填坑指南
javascript·数据库·爬虫
奶昔不会射手1 天前
css3之grid布局
前端·css·css3
举个栗子dhy1 天前
解决在父元素上同时使用 onMouseEnter和 onMouseLeave时导致下拉菜单无法正常展开或者提前收起问题
前端·javascript·react.js