javascript - React setState 嵌套数组回调

标签 javascript reactjs primereact

我有一个父组件,其中包含一个对象,其中包含一些表示范围的嵌套数组:

    class ParentComponent extends React.Component {

        constructor() {
                super();
                this.state = {
                    filters: {
                        rangeArray1: [0, 2000],
                        rangeArray2: [0, 5000]
                       // and many other similar nested arrays
                    }
                } 
            }

          //this gives TypeError: Cannot read property 'name' of undefined
          //it works if there were nested objects instead of arrays
          handleFilterChange = (e) => {
            this.setState({
                filters: {
                    ...this.state.filters,
                    [e.target.name]: e.target.value,
                }
            })
        }

          //this works, but I need a method that handles all the arrays
          handleFilterChange = (e) => {
            this.setState({
                filters: {
                    ...this.state.filters,
                    rangeArray1: e.value,
                }
            })
        }

        //render method omitted     
     }

我还有一个更深的嵌套子组件,它使用范围 slider 按范围处理过滤:

        class GrandchildComponent extends React.Component {

                handleFilterChange = e => {
                    this.props.handleFilterChange && this.props.handleFilterChange(e)
                };

                render() {
                    return (
                        <div>
                             <p>Range1: {this.props.filters.rangeArray1[0]} - {this.props.filters.rangeArray1[1]}</p>
                             <Slider id="rangeArray1"
                                     value={this.props.filters.rangeArray1}
                                     name="rangeArray1"
                                     onChange={this.handleFilterChange}/>

                             <p>Range2: {this.props.filters.rangeArray2[0]} - {this.props.filters.rangeArray2[1]}</p>
                             <Slider id="rangeArray2"
                                     value={this.props.filters.rangeArray2}
                                     name="rangeArray2"
                                     onChange={this.handleFilterChange}/>

                             //and many other similar sliders
                        </div>
                    )
                }
            }

我遇到一种情况,用户使用范围 slider 过滤一些数据,并且我尝试使用回调方法handleFilterChange将输入发送到我的父组件。我在创建一个可以处理对象中所有数组的方法时遇到问题。 我添加了一些我尝试过的示例代码,但是我的两个示例都有一些缺陷。

我正在使用 Primereact slider组件

最佳答案

根据 Slider 的文档您正在使用的组件。 onChange 回调函数的参数是一个带有键 originalEvent: Slide event 的对象, 值:新值。因此,要访问目标,您需要使用 event.originalEvent.target

所以像这样改变你的函数:

handleFilterChange = (e) => {
    this.setState({
        filters: {
            ...this.state.filters,
            [e.originalEvent.target.name]: e.value,
        }
    })
}

另一种方法是,如果您不想使用 e.target,那么您可以使用 e.target 中的 name可以直接传递给函数

父组件内部:

handleFilterChange = (sliderName, value) => {
    this.setState({
        filters: {
            ...this.state.filters,
            [sliderName]: value,
        }
    })
}

子组件:

class GrandchildComponent extends React.Component {
    handleFilterChange = (name, value) => {
        this.props.handleFilterChange && this.props.handleFilterChange(name, value)
    };
    render() {
        return (
            <div>
                <p>Range1: {this.props.filters.rangeArray1[0]} - {this.props.filters.rangeArray1[1]}</p>
                <Slider id="rangeArray1"
                    value={this.props.filters.rangeArray1}
                    onChange={(e) => this.handleFilterChange(
                        'rangeArray1', e.value
                    )}
                />

               //and many other similar sliders
            </div>
        )
    }
}

关于javascript - React setState 嵌套数组回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61342076/

相关文章:

javascript - 试图将 jquery 插件转换为 Angular 指令

javascript - 为什么 Internet Explorer 会阻止我访问父窗口的 JavaScript?

javascript - 尝试通过React应用程序从 azure 文件共享下载文件

reactjs - 为什么 typescript 允许我覆盖空状态对象?

javascript - 与 Node 服务器一起使用时,webpack 创建的bundle.js 未加载

css - PrimeReact 和样式组件

reactjs - 如何在 primereact 中拥有主题切换器

javascript - Google Web Speech API 中的奇怪行为

javascript - 在 Jquery 中读取 JSON 结果的值

reactjs - PrimeReact 数据表 - 如何在单元格上显示工具提示或标题?