С учетом этого кода реакции
<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
}
Я вижу, что теряю «this», когда я нахожусь в функции onFormSubmit, так что там я не могу, например, выполнить 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
}
OptionB , для передачи 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({...})
}