You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Material UI Slider滑动报错:Uncaught TypeError: Cannot read properties of null (reading 'getBoundingClientRect')

解决Material UI范围滑块滑动时的getBoundingClientRect错误

问题原因

你把CibilScoreFilterComponent定义在了父组件内部,每次父组件重新渲染时,这个内部组件都会被重新创建,导致Slider关联的DOM元素被频繁卸载和重建,滑动时组件找不到对应的DOM节点,就会抛出Cannot read properties of null (reading 'getBoundingClientRect')错误,同时导致滑动不流畅。

修复方案

方案1:将组件移到父组件外部

把CibilScoreFilterComponent从父组件的作用域中抽离出来,作为独立组件存在,避免每次父组件渲染时重新创建组件:

import { useState } from 'react';
import Slider from '@mui/material/Slider';

// 独立定义组件,放在父组件外部
const CibilScoreFilterComponent = ({ cibilScoreRange, handleCibilScoreChange }) => {
    return (
        <div className="slider-wrapper">
            <Slider
                min={300}
                max={900}
                value={cibilScoreRange}
                onChange={handleCibilScoreChange}
                valueLabelDisplay="on"
            />
        </div>
    )
}

// 父组件
const ParentComponent = () => {
    const [cibilScoreRange, setCibilScoreRange] = useState<number[]>([300, 900]);

    const handleCibilScoreChange = (event: Event, newScoreRange: number | number[]) => {
        setCibilScoreRange(newScoreRange as number[]);
    };

    return <CibilScoreFilterComponent cibilScoreRange={cibilScoreRange} handleCibilScoreChange={handleCibilScoreChange} />;
}

方案2:将内部组件改为渲染函数

如果不想抽离组件,也可以把CibilScoreFilterComponent改成一个普通的渲染函数,而不是React组件:

const ParentComponent = () => {
    const [cibilScoreRange, setCibilScoreRange] = useState<number[]>([300, 900]);

    const handleCibilScoreChange = (event: Event, newScoreRange: number | number[]) => {
        setCibilScoreRange(newScoreRange as number[]);
    };

    // 改成普通函数,不是组件
    const renderCibilSlider = () => {
        return (
            <div className="slider-wrapper">
                <Slider
                    min={300}
                    max={900}
                    value={cibilScoreRange}
                    onChange={handleCibilScoreChange}
                    valueLabelDisplay="on"
                />
            </div>
        )
    }

    return <>{renderCibilSlider()}</>;
}

方案3:用useMemo缓存内部组件

如果必须在父组件内定义组件,可以用useMemo缓存组件,避免重复创建:

import { useState, useMemo } from 'react';
import Slider from '@mui/material/Slider';

const ParentComponent = () => {
    const [cibilScoreRange, setCibilScoreRange] = useState<number[]>([300, 900]);

    const handleCibilScoreChange = (event: Event, newScoreRange: number | number[]) => {
        setCibilScoreRange(newScoreRange as number[]);
    };

    // 用useMemo缓存组件,依赖项为用到的state和函数
    const CibilScoreFilterComponent = useMemo(() => {
        return () => (
            <div className="slider-wrapper">
                <Slider
                    min={300}
                    max={900}
                    value={cibilScoreRange}
                    onChange={handleCibilScoreChange}
                    valueLabelDisplay="on"
                />
            </div>
        )
    }, [cibilScoreRange, handleCibilScoreChange]);

    return <CibilScoreFilterComponent />;
}

额外说明

确保你已经正确安装并导入了Material UI的Slider组件,使用的依赖版本和官方文档匹配(如@mui/material v5版本)。

内容的提问来源于stack exchange,提问作者itsDespair1000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:57:27