首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SetState不是OnChange上的函数

setStateonChange 是在前端开发中,特别是在使用 React 这样的库时经常遇到的两个概念。它们各自有不同的用途和上下文。

基础概念

setState

  • setState 是 React 组件中的一个方法,用于更新组件的状态(state)并触发重新渲染。
  • 它通常用于响应用户的交互或其他事件,以更新 UI。

onChange

  • onChange 是一个事件处理器,它在用户更改输入字段的值时被触发。
  • 它常用于表单元素,如 <input><textarea><select>,以便实时响应用户的输入。

相关优势

setState

  • 自动触发组件的重新渲染,确保 UI 与状态保持同步。
  • 支持异步更新,可以批量处理多个状态更新以提高性能。

onChange

  • 提供实时的用户输入反馈,增强用户体验。
  • 可以用于验证输入数据的有效性或即时处理数据。

类型与应用场景

setState

  • 类型:同步或异步(取决于 React 的版本和实现)。
  • 应用场景:几乎任何需要更新组件状态的地方,如按钮点击、API 响应处理等。

onChange

  • 类型:事件处理器。
  • 应用场景:表单输入、滑块调整、选择框变动等需要实时响应用户操作的情况。

遇到的问题及解决方法

如果你遇到“setState 不是 onChange 上的函数”的错误,这通常意味着你在错误的地方调用了 setStateonChange 应该是一个事件处理函数,而 setState 应该在这个函数内部被调用。

错误示例:

代码语言:txt
复制
<input onChange={this.setState({ value: event.target.value })} />

正确示例:

代码语言:txt
复制
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { value: '' };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    this.setState({ value: event.target.value });
  }

  render() {
    return (
      <input type="text" value={this.state.value} onChange={this.handleChange} />
    );
  }
}

在上面的正确示例中,handleChange 是一个方法,它在 onChange 事件发生时被调用,并且在这个方法内部调用 setState 来更新状态。

总结来说,setStateonChange 是两个不同的概念,分别用于状态管理和事件处理。在使用时,应该确保 setState 被放置在正确的事件处理函数内部。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

React-setState函数必须掌握的pendingState状态

记录问题 异步更新原则 当然我们都清楚setState函数是react将对组件的state更改排入队列进行批量更新。...如果是传参只能使用箭头函数的方式了 private onBtnClick = () => { this.setState({ name: this.state.name + 2,...此时页面上展示this.state.name内容为2,并不是所期待的4。这很好理解,批量更新原则嘛,(react内部会对state的值进行缓存最终合并一次性更新)乍一看和Vue大同小异。...如果是传参只能使用箭头函数的方式了 private onBtnClick = () => { setTimeout(() => { this.setState({...怎么会这样,按照我的理解,不是说好了批量更新策略,即使在setTimeout之后,下一个队列中应该也是批量呀。这是什么操作,为什么会这样。不行我要翻出来看看!

1.2K10

React 中 getDerivedStateFromProps 的三个场景

,我们在获取任何操作时都可能要去判断 props上的值。...={this.onChange} />; } } 鉴于 getDerivedStateFromProps的设计,我们可以安全的把 props的值都同步到 state上,这样在使用的时候只需要从 state...注意,在这里我们去判断 props上的字段是不是我们要的类型(在这里是 string)而不是判断 props上有没有这个字段,因为用户可能封装了一层组件,导致 props上有这个字段,但是它的值是 undefined...={this.onChange} onBlur={this.onBlur} /> ); } } 三、记忆 记忆(memorize)是一种简单常见的优化方式,通过脏检查两次传入的值是不是同一个来记忆结果...通常通过一个简单的帮助函数就可以完成这样的功能: // 当然使用数组或者对象,并传入自定义的比较函数就可以实现记忆多个参数 function memorize(func) { let prev;

2.3K10
  • concent 骚操作之组件创建&状态更新

    这里一个示例项目文件组织结构,不同的人可能有不同的理解方式和组织习惯,这里只是以一个基本上社区上公认的通用结构作为范本来为后面的代码解读做基础,实际的文件组件方式用户可以根据自己的情况做调节|____runConcent.js...基于hook创建组件 虽然registerDumb写起来像函数组件了,但实际上出现了3层结构不是我们希望看到的,我们来使用hook方式重构此组件吧,concent提供了useConcent接口来创建组件...现在让我们看看实际效果吧 [dqohk5uf4i.gif] 因为这些实例都是属于demo模块的组件,所以无论我修改任何一处,其他地方视图都会同步被更新,是不是将特别方便呢?...使用sync更新 当然如果对于这种单个key的更新,我们也可以不用写setState,而是直接使用concent提供的工具函数sync来完成值的提取与更新 // 改写HookComp使用sync来更新,...的reducer函数,免去用户声明一次 await actionCtx.setState({loading:true}); await api.updateName(name); //

    90753

    优化 React APP 的 10 种方法

    示例:搜索在bit.dev上共享的React组件 1. useMemo() 这是一个React钩子,用于在React中消耗大量CPU资源的函数中进行缓存。...cheapableFunc在JSX中呈现,对于每次重新呈现,都会调用该函数,并将返回值呈现在DOM上。...setState每次调用都会创建新的状态对象,所以严格相等运算符将看到不同的内存引用并触发组件上的重新呈现。...如果再次单击该按钮,我们将有另一个重新渲染,不是这样,因为前一个状态对象和下一个状态对象将具有相同的data值,但是由于setState新状态对象的创建,React将看到差异状态对象引用和触发器重新呈现...这样,React为我们提供了一种方法来控制组件的重新渲染,而不是通过React来控制内部逻辑,这是shouldComponentUpdate方法。

    33.9K20

    react hook开发遇到的一些问题

    问题一 使用 useState改变值后 拿到的值不是最新值 const [isFocus, setIsFocus] = useState(false) const changeFocus...所以调用setState之后无法立刻拿到最新的值 使用setTimeout也不行 解决办法 使用useEffect 以isFocus为依赖 触发副作用然后做你想做的事 问题二 使用刷卡器刷卡时发现设备是将卡片...ID一次一次的读出来的 需要使用防抖函数包裹一下刷卡的相关操作 使用防抖函数包裹发现没有效果 const handleCardRead = useCallback(debounce(() => {...render 都会导致在函数内部定义的变量都会被重新初始化;意味着每次调用debounce函数时都会重新注册一个 setTimeout 回调 使用 useRef 返回的值被缓存了起来 因此函数式组件重新渲染不会导致...debounce的重复执行 使用 useCallback 声明只在组件初始化时创建debounce函数 第二个参数依赖需要设置为空数组 获取输入框的值 使用antd框架 通过 onChange const

    38720

    从 0 到 1 实现 React 系列 —— 5.PureComponent 实现 && HOC 探幽

    性能的一种常用手段,相较于 Component, PureComponent 会在 render 之前自动执行一次 shouldComponentUpdate() 函数,根据返回的 bool 值判断是否进行...oldState[oldKeys[i]]) { flag = false break } } return flag } 测试用例 测试用例用 在 React 上提的一个...属性代理(Props Proxy) 这类实现也是装饰器模式的一种运用,通过装饰器函数给原来函数赋能。下面例子在装饰器函数中给被装饰的组件传递了额外的属性 { a: 1, b: 2 }。...= this.onChange.bind(this) } onChange(e) { this.setState({ value: e.target.value...这里有个坑点,当我们在输入框输入字符的时候,并不会立马触发 onChange 事件(我们想要让事件立即触发,然而现在要按下回车键或者点下鼠标才触发),在 react 中有个合成事件 的知识点,下篇文章会进行探究

    74210

    React 进阶 - Component 组件

    ,但是与常规的类和函数不同的是,组件承载了渲染视图的 UI 和更新视图的 setState 、 useState 等方法。...React 在底层逻辑上会像正常实例化类和正常执行函数那样处理的组件。 函数与类上的特性在 React 组件上同样具有,比如原型链,继承,静态属性等,所以不要把 React 组件和类与函数独立开来。...,除了继承 React.Component ,底层还加入了 updater 对象,组件中调用的 setState 和 forceUpdate 本质上是调用了 updater 对象上的 enqueueSetState...props 和 context ,初始化置空 refs 属性,原型链上绑定setState、forceUpdate 方法。...prototype 绑定属性或方法,即使绑定了也没有用,因为 React 对函数组件的调用,是采用直接执行函数的方式,而不是 new 的方式。

    45910

    React - 组件:类组件

    应该知道input的内容,然后把值设置给state数据,再把state数据放到list列表中渲染。) 2-1、需要onChange事件监听input输入。回调函数=类里边定义的函数。...2-2、onChange后给state里的inputVal赋值 注意回调函数内部this的指向:默认,this指向undefined ?...onChange= { this.handleChange } 3、箭头函数改变this指向【重点、核心方案】 onChange= { this.handleChange } ?...4、匿名函数【要传参的情况】 在匿名函数内部让函数去执行 ? ? 一个函数里有多个setState: ? setState里边传入对象,会有参数覆盖的情况。上图示例中只执行最后一个。...setState接收函数的情况:setState纯函数 就想设置多个setState还想绕过批量更新,就可以在setState函数里传参函数: ? return的对象里边是你要更改的状态。

    1.9K20

    精读《怎么用 React Hooks 造轮子》

    拿到组件 onChange 抛出的值 效果:通过 useInputValue() 拿到 Input 框当前用户输入的值,而不是手动监听 onChange 再腾一个 otherInputValue和一个回调函数把这一堆逻辑写在无关的地方......name} />; 可以看到,这样不仅没有占用组件自己的 state,也不需要手写 onChange 回调函数进行处理,这些处理都压缩成了一行 use hook。...封装原有库 是不是 React Hooks 出现后,所有的库都要重写一次?当然不是,我们看看其他库如何做改造。...封装原本对 setState 增强的库 Hooks 也特别适合封装原本就作用于 setState 的库,比如 immer。...useState 虽然不是 setState,但却可以理解为控制高阶组件的 setState,我们完全可以封装一个自定义的 useState,然后内置对 setState 的优化。

    2.5K40

    【React】学习笔记(一)——React入门、面向组件编程、函数柯里化

    类中的构造器不是必须写的,要对实例进行一些初始化的操作,如添加指定属性时才写 如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须要调用的 类中所定义的方法,都放在了类的原型对象上...类方法定义在类的原型对象上,供实例使用,通过类实例调用方法时,方法中的 this 指向的就是类实例。...//严重注意:状态必须通过setState进行更改,且更新是一种合并,并不是替换 this.setState({isHot:!...这个API操作是合并操作,而不是替换。...4.3、总结 受控组件 受控组件依赖于状态 受控组件的修改会实时映射到状态值上,此时可以对输入的内容进行校验 受控组件只有继承React.Component才会有状态 受控组件必须要在表单上使用

    5.1K30
    领券