gpt4 book ai didi

javascript - React,调用无状态函数来组织代码,但是这个怎么绑定(bind)呢?

转载 作者:行者123 更新时间:2023-11-28 17:15:21 26 4
gpt4 key购买 nike

鉴于此 react 代码

<form onSubmit={this.onSubmit}>

执行函数

import {onFormSubmit} from '../onFormSubmit'
.....
onSubmit = (e) => {
// here I have access to "this" thanks to the arrow functions
e.preventDefault()
onFormSubmit(this.state.files, this.props)
}

其中 onFormSubmit 作为无状态函数驻留在另一个文件中

export const onFormSubmit = async (files,props) => {
this.setState(... // error
}

我发现当我在 onFormSubmit 函数中时我丢失了“this”,因此我无法执行 this.setState

那么,我怎样才能保持这个访问权限呢?

选项 A,正如答案中所说,是忘记箭头:

onSubmit = (e) => {
// here I have access to "this" thanks to the arrow functions
e.preventDefault()
onFormSubmit.bind(this)(this.state.files, this.props)
}

.

export async onFormSubmit = function(files,props) {
this.setState(... // now it works
}

选项 B,将 this 作为变量传递

onSubmit = (e) => {
// here I have access to "this" thanks to the arrow functions
e.preventDefault()
let self = this
onFormSubmit(self)
}

选项 C,将 onFormSubmit 重新定义为更新程序,如答案中所述,但不是此处的选项,因为该函数不仅更新状态,对于示例:

export const onFormSubmit = async (files,props) => {
if (files) {
... upload file ... parse file ...
this.setState({'data': data})
} else {
... fetch file ... concat file ... doesn't update the state
}
... and more calculations
this.setState({...})
}

最佳答案

onFormSubmit 是一个箭头函数,它不能被绑定(bind),除非它被转译为 ES5,并且依赖它会是一个错误。

一个快速而肮脏的修复方法是使其正常运行:

export async function onFormSubmit (files,props) {
this.setState(...
}

在这种情况下依赖动态 this 可能会很尴尬,此时它并不比将 this 作为参数传递更好。

由于此函数的目的是更新状态,因此更简洁的方法是使其状态为 updater工厂:

export const onFormSubmit = (props) => prevState => {
const { files } = prevState;
return { /* new state */ };
}

可以这样使用:

this.setState(onFormSubmit(this.props));

files 可在 prevState 上使用。将 this.statesetState 一起使用是一种反模式,因为 setState 是异步的,这可能会导致竞争条件。

或者如果是异步的,则使其不负责更新状态,例如它返回一个 promise :

const newStateObj = await onFormSubmit(this.state.files, this.props);
this.setState(newStateObj);

如果是同步的,由于上述原因,使用 this.state 并不是一个好主意。

关于javascript - React,调用无状态函数来组织代码,但是这个怎么绑定(bind)呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com