将参数从函数传递给 this.setState 回调函数

IT技术 javascript reactjs
2021-05-23 03:47:56

我在这里遇到了一些问题。我试图将一个函数的参数传递给this.setState回调,但我不知道这怎么可能。

我的代码如下所示:

selectHandler(event){
    this.setState({
        selectedImage: event.target
    }, (event) => {
        this.markSelectedHandler(event)
    })
}

markSelectedHandler(e){
    e.target.classList.add('active')
    if(e.target !== this.state.selectedImage && this.state.selectedImage){
        this.state.selectedImage.classList.remove('active')
        e.target.classList.add('active')
    }
}

e.target 返回 null,知道为什么会发生这种情况吗?

3个回答

该事件不会异步工作。您需要提取值或使用 e.persist() reactjs.org/docs/events.html#event-pooling

不过你可以说:

selectHandler(event){
    const { target } = event;

    this.setState({
        selectedImage: target
    }, () => {
        this.markSelectedHandler(target)
    })
}

markSelectedHandler(target){
    target.classList.add('active')
    if(target!== this.state.selectedImage && this.state.selectedImage){
        this.state.selectedImage.classList.remove('active')
        target.classList.add('active')
    }
}

但我会建议反对它..

老实说,您不应该使用 DOM 操作添加您的类,而是将其添加到您的渲染中 <img className={this.state.selectedImage === myImage ? 'active' : undefined} />

event在这段代码中隐藏你的

selectHandler(event){
    this.setState({
        selectedImage: event.target
    }, (event) => {
        this.markSelectedHandler(event)
    })
}

您不需要通过不传递具有相同名称的参数(eventsetState回调)隐藏:

selectHandler(event){
    this.setState({
        selectedImage: event.target
    }, () => {
        this.markSelectedHandler(event)
    })
}

尽量不要event作为参数发送给回调

例如你写了

selectHandler(event){
    this.setState({
        selectedImage: event.target
    }, (event) => {
        this.markSelectedHandler(event)
    })
}

改为这样写

selectHandler(event){
    this.setState({
        selectedImage: event.target
    }, () => {
        this.markSelectedHandler(event)
    })
}