javascript - 使用 useSelector 强制进行一次重新渲染

标签 javascript reactjs react-hooks

这是 Refactoring class component to functional component with hooks, getting Uncaught TypeError: func.apply is not a function 的后续内容

我已经声明了一个功能组件 Parameter,它使用 useSelector Hook 从 actions/reducers 中提取值:

const Parameter = () => {
let viz = useSelector(state => state.fetchDashboard);
const parameterSelect = useSelector(state => state.fetchParameter)
const parameterCurrent = useSelector(state => state.currentParameter)
const dispatch = useDispatch();
const drawerOpen = useSelector(state => state.filterIconClick);

const handleParameterChange = (event, valKey, index, key) => {
    parameterCurrent[key] = event.target.value;
    return (
        prevState => ({
            ...prevState,
            parameterCurrent: parameterCurrent
        }),
        () => {
            viz
                .getWorkbook()
                .changeParameterValueAsync(key, valKey)
                .then(function () {
                    //some code describing an alert
                    });
                })

                .otherwise(function (err) {
                    alert(
                        //some code describing a different alert
                    );
                });
        }
    );
};
const classes = useStyles();
return (
    <div>
        {drawerOpen ? (
            Object.keys(parameterSelect).map((key, index) => {
                return (
                    <div>
                        <FormControl component="fieldset">
                            <FormLabel className={classes.label} component="legend">
                                {key}
                            </FormLabel>
                            {parameterSelect[key].map((valKey, valIndex) => {
                                return (
                                    <RadioGroup
                                        aria-label="parameter"
                                        name="parameter"
                                        value={parameterCurrent[key]}//This is where the change should be reflected in the radio button
                                        onChange={(e) => dispatch(
                                            handleParameterChange(e, valKey, index, key)
                                        )}
                                    >
                                        <FormControlLabel
                                            className={classes.formControlparams}
                                            value={valKey}
                                            control={
                                                <Radio
                                                    icon={
                                                        <RadioButtonUncheckedIcon fontSize="small" />
                                                    }
                                                    className={clsx(
                                                        classes.icon,
                                                        classes.checkedIcon
                                                    )}
                                                />
                                            }
                                            label={valKey}
                                        />
                                    </RadioGroup>
                                );
                            })}
                        </FormControl>
                        <Divider className={classes.divider} />
                    </div>
                );
            })
        ) : (
                <div />
            )
        }
    </div >
)
};
export default Parameter;

我需要发生的是 value={parameterCurrent[key]} 在handleParameterChange上重新渲染(handleChange确实更新了底层仪表板数据,但单选按钮不会显示为被选中,直到我关闭主组件并重新打开它)。我以为我有一个强制重新渲染的解决方案,但因为这是一个较小的组件,是较大组件的一部分,所以它破坏了组件的其他部分(即,它正在重新渲染并阻止其他组件获取来自 reducer 的状态/ Prop )。我已经在互联网上搜索解决方案两天了,但还没有找到任何有效的方法。非常感谢任何帮助! TIA!

最佳答案

useSelector() 默认情况下使用严格的 === 引用相等性检查,而不是浅层相等性检查。

要使用浅等检查,请使用此

import { shallowEqual, useSelector } from 'react-redux'

const selectedData = useSelector(selectorReturningObject, shallowEqual)

Read more

关于javascript - 使用 useSelector 强制进行一次重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60715959/

相关文章:

javascript - 如何解决此 Javascript 错误 TypeError : 'undefined' is not an object (evaluating 't.subscribe' )?

javascript - 我可以制作一个共享的reactjs验证组件吗?

javascript - 如何使用 ReactJS 在 CKEditor 5 中配置上传适配器?

javascript - 使用 eslint exhaustive-deps react 订阅/取消订阅的 useEffect 依赖项

javascript - Ionic Reactjs解析错误: Expression expected when rendering element based on Select Box

javascript - 是否可以将多个 SVG 绘制到 Canvas 上?

javascript - 使用 jQuery 将 tr 附加到 thead 结果空白表行

Javascript 验证表单检查文本区域长度

reactjs - create-react-app 中 EXTEND_ESLINT=true 时 typescript 解析错误

javascript - React按钮点击事件更新状态值但未反射(reflect)在按钮文本上