react-redux基本使用

创建 store

import { createStore } from 'redux';
const defaultState = {
    language: 'zh',
    languageList: [
        { name: '中文', code: 'zh' },
        { name: '英文', code: 'en' }
    ]
}

const reducer = (state = defaultState, action) => {
    switch (action.type) {
        case "change_labguage":
            return { ...state, language: action.payload };
        default:
            return state
    }
}

const store = createStore(reducer);
export default store;

入口文件导入 store

import store from 'redux/index';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'
ReactDOM.render(
    <Provider  store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
)

在类组件中使用

import { connect } from 'react-redux';
// 将 store 中的数据注入到 props 
const mapStateTopProps = (state) => {
    return {
        language: state.language,
        languageList: state.languageList
    }
}
// 将 dispatch 导入到 props
const mapDispatchToProps = (dispatch) {
    return {
        changeLanguage: (code) => {
            const action = {
                type: "change_language",
                payload: code
            }
            dispatch(action);
        }
    }
}

class HeaderComponent extends React.Component {

    menuClickHander = (e) => {
        this.props.changeLanguage(e.key);
    }

    render() {
        return (
            <div className="header">
                <Dropdown.Button
                    overlay={
                        <Menu onClick={() => this.menuClickHander} items={this.props.languageList.map(l => { return { key: l.code, label: l.name } })} />
                    }>{this.props.language === 'zh' ? '中文' : 'English'}</Dropdown.Button>
            </div>
        )
    }
}
export const HeaderClass = connect(mapStateTopProps, mapDispatchToProps)(HeaderComponent);

在函数组件中使用

import { useSelector, useDispatch } from 'react-redux';
const HeaderFC = () => {
    // 获取 store 数据
    const language = useSelector(state => state.language);
    const languageList = useSelector(state => state.languageList);

    const dispatch = useDispatch();

    const menuClickHander = (e) => {
        const action = {
            type: 'change_labguage',
            payload: e.key
        }
        dispatch(action);
    }

    return (
        <div className="header">
            <Dropdown.Button
                overlay={ <Menu 
                            onClick={() => this.menuClickHander} 
                            items={languageList.map(l => { return { key: l.code, label: l.name } })} />
                }>{language === 'zh' ? '中文' : 'English'}
                </Dropdown.Button>
        </div>
    )
}
 export default HeaderFC;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海面有风

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值