首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使反应组分“反应性”

使反应组分“反应性”
EN

Stack Overflow用户
提问于 2022-08-09 11:04:20
回答 1查看 73关注 0票数 1

我有以下问题:我制作了一个减轻switch (){ case 1: case 2:}行为的组件。我希望我的组成部分对国家的变化作出“反应”。我用的是Redux。事情是这样的:

代码语言:javascript
复制
// Switch component
import { Fragment } from 'react'

export const Switch = props => {
    const children = Array.isArray(props.children) ? props.children : [props.children];
    return children.find(child => child?.props.case === props.condition);
}

export const Case = props => {
    return <Fragment>{props.children}</Fragment>;
}

更远的视图或任何其他组件..。

代码语言:javascript
复制
// Main.js
export const Main = () => {
    const currentView = useSelector(state => state.currentView);

    return (
            <Fragment>
                    <Switch condition={currentView}>
                        <Case case="view-1">
                            <StartScreen />
                        </Case>
                        <Case case="view-2">
                            <EndScreen />
                        </Case>
                        <Case case="view-3">
                            <OtherScreen />
                        </Case>
                    </Switch>
            </Fragment>
    );
};

提供商店

代码语言:javascript
复制
import React from 'preact/compat'
import {Provider} from 'react-redux';
import {store} from './actions/store';
import {Main} from './components/Main';

export const App = () => {
    return (
        <React.StrictMode>
            <Provider store={store}>
                <Main />
            </Provider>
        </React.StrictMode>
    );
}

Store.js -创建商店

代码语言:javascript
复制
import {createStore, applyMiddleware} from 'redux';
import thunk from 'redux-thunk';
import {reducer} from '../reducer/reducer';

const middlewares = [
    thunk,
];

export const getCustomStore = (customState) =>
    createStore(reducer, customState, applyMiddleware(...middlewares));

export const store = getCustomStore({});

// This dispatch should only be used outside the preact scope.
// When inside a preact component use "useCustomDispatch()" instead.
export const dispatch = async (...params) => store.dispatch(...params);

减速器

代码语言:javascript
复制
import { INITIAL_STATE } from '../constants/INITIAL_STATE';
import { stateModifiers } from '../actions/stateModifiers';

const modifiers = {
    ...stateModifiers,
};

export const createReducer = (initialState) =>
    (state = initialState, action) =>
        modifiers?.[action.type]?.(state, action);

export const reducer = createReducer(INITIAL_STATE);

我遇到的主要问题是,当currentView在状态中发生变化时,这个组件不会对更改做出反应。它只在初始负载下工作。在这方面的任何帮助都将受到高度赞赏,各位:)

EN

回答 1

Stack Overflow用户

发布于 2022-08-11 15:14:54

我只是通过传递属性并在开关组件中使用状态选择来解决这个问题:

代码语言:javascript
复制
// Switch
import { useSelector } from 'react-redux'
import { Fragment } from 'react'

export const Switch = props => {
    const children = Array.isArray(props.children) ? props.children : [props.children];
    const property = useSelector(state => state[props.condition])
    const matcher = property ?? props.condition;
    return children.find(child => child?.props.case === matcher);
}

export const Case = props => {
    return <Fragment>{props.children}</Fragment>;
}

我刚刚带来了状态,通过检查,条件是否与状态中的属性相匹配。另外,我假设如果propertyundefined,那么条件应该与提供的字符串相匹配,尽管道具会检查状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73290768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档