[Recompose] Add Local State with Redux-like Reducers using Recompose

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Recompose] Add Local State with Redux-like Reducers using Recompose相关的知识,希望对你有一定的参考价值。

Learn how to use the ‘withReducer‘ higher order component using the alternative reducer form. If you like using reducers in redux, you’ll be able to reuse that same technique but for local state.

 

import React from react;
import {withReducer, withHandlers, compose} from recompose;

const UserStyle = {
    position: relative,
    background: lightblue,
    display: inline-block,
    padding: 10px,
    cursor: pointer,
    marginTop: 50px
};


const StatusListStyle = {
    background: #eee,
    padding: 5px,
    margin: 5px 0
};

const TooltipStyle =  {
    fontSize: 10px,
    position: absolute,
    top: -10px,
    width: 80px,
    background: #666,
    color: white,
    textAlign: center
};

const StatusList = () =>
    <div style={StatusListStyle}>
        <div>pending</div>
        <div>inactive</div>
        <div>active</div>
    </div>;

const withToggle = compose(
    withReducer(toggleState, dispatch, (state = false, action) => {
        switch(action.type) {
            case SHOW:
                return true;
            case HIDE:
                return false;
            case TOGGLE:
                return !state;
            default:
                return state;
        }
    }, false),
    withHandlers({
        toggle: ({dispatch}) => (e) => dispatch({type: TOGGLE}),
        show: ({dispatch}) => (e) => dispatch({type: SHOW}),
        hide: ({dispatch}) => (e) => dispatch({type: HIDE})
                 })
);

const Statue = withToggle(
    ({ status, toggle, toggleState }) =>
        (<span onClick={() => toggle(!toggleState)}>
            {status}
            {toggleState && <StatusList/>}
        </span>)
);

const Tooltip = withToggle(({ show, hide, toggleState, text, children }) => (
    <span>
        <span>
            {toggleState && <div
                style={TooltipStyle}>
                { text }
            </div>}
             <span
                 onMouseOver={show}
                 onMouseOut={hide}
             >
                { children }
            </span>
        </span>
    </span>
));

const User2 = ({ status, name }) => (
    <div style={UserStyle}>
        <Tooltip text="Cool Dude!">{name}</Tooltip>-
        <Statue status={status}/>
    </div>
);

export default User2;

 

‘withReducer‘ take (state_name, dispatch_function, reducer_function, init_state) as params.

以上是关于[Recompose] Add Local State with Redux-like Reducers using Recompose的主要内容,如果未能解决你的问题,请参考以下文章

[Recompose] Add Lifecycle Hooks to a Functional Stateless Component using Recompose

[Recompose] Lock Props using Recompose -- withProps

[Recompose] Transform Props using Recompose --mapProps

[Recompose] Refactor React Render Props to Streaming Props with RxJS and Recompose

使用 recompose 和 typescript 正确键入 HigherOrderComponents

你如何从 recompose 中读取这个 curry'd 函数……我的脑痛