Zac*_*Zac 2 javascript reactjs material-ui
我正在构建一个界面,您可以在其中选择收音机,它将显示不同的表单元素。
当滑块显示时,值更改将设置到页面上呈现的对象中。
在这个例子中,我有它,所以它确实更新了对象,但滑块不再移动,即使如果您单击该行,该值已正确设置。
https://codesandbox.io/s/shy-dawn-e5zyu
我设置的对象在父对象中声明:
const defaultActivity = {
group: "",
a: 0,
b: 0
};
const [activity, setActivity] = useState(defaultActivity);
Run Code Online (Sandbox Code Playgroud)
然后,在包含滑块的子组件中,该handleChange函数在该组件中使用,并且我还使用父函数来访问setActivity.
const TestSlider = (props) => {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
// This sets the slider value to the activity object
// if you comment this line out then the sliders slide correctly
props.onDataChanged(props.name.toLowerCase(), newValue);
};
return (
<React.Fragment>
<Typography id="discrete-slider" gutterBottom>
{props.name}
</Typography>
<Slider
value={value}
aria-labelledby="discrete-slider"
valueLabelDisplay="auto"
step={props.step}
marks
min={0}
max={props.max}
name={props.name}
onChange={handleChange}
/>
</React.Fragment>
);
};
Run Code Online (Sandbox Code Playgroud)
以及onDataChanged父级中的该方法
const onDataChanged = (name, value) => {
setActivity({
...activity,
[name]: value
});
};
Run Code Online (Sandbox Code Playgroud)
正如我在评论中指出的那样,如果您删除该onDataChanged方法,则滑块会再次工作。我也尝试过搬到handleChange父母那里,但这没有帮助。
创建此沙箱后,我似乎遇到了一个零星的新问题,并且我不清楚复制出现错误的位置的步骤:
Cannot read property 'getBoundingClientRect' of null
可能与滑块损坏问题或我搞砸的其他问题有关。预先感谢您对此的任何帮助,我正在努力学习 React 的方法,但这个问题让我真的很难过。
=============更新:更接近预期和新问题=============
仍在尝试这个,并决定尝试onChangeCommitted在滑块上使用,以尝试断开滑块中设置的值与主对象的连接。现在它会滑动并更新粘在对象中的值,但滑块 UI 会重置为 0。很难解释,所以如果你去玩一下并明白我的意思,也许会更容易。我认为我设置默认状态的方式可能是问题所在,但不确定如何重构:
https://codesandbox.io/s/sleepy-euler-0dv69?file=/src/TestSlider.js:116-163
问题的根源在于组件是在( ) 组件RenderSwitch内部创建(声明)的。搬到外面并传递所有必要的道具可以解决问题。这是一个工作的codesandbox。AddActivitySelectSelectFormRenderSwitch
发生了什么:
props.setActivity时TestSlider,activity状态会更新AppApp重新渲染也会导致SelectForm重新渲染。RenderSwitch因为内部创建了一个全新的组件SelectForm,前一个组件被卸载(销毁)。RenderSwitch被渲染,调用React.useState(0),这就是滑块value为 0的原因| 归档时间: |
|
| 查看次数: |
1802 次 |
| 最近记录: |