简单登录注册例子实现redux功能

以登录存贮账号密码为例:

actions部分:

actions/login.js:

export function updateAccount(value) { 
    return {
        type: 'UPDATE_ACCOUNT',
        value
    }
}

export function updatePsW(value) {
    return {
        type: 'UPDATE_PASSWORK',
        value
    }
}

 

 reducers部分:

 reducers/login.js


const stateData = {
    'account': 'admin',
    'passWork':'123456'
}
const login = (state = stateData, action) => { 
    switch (action.type) { 
        case 'UPDATE_ACCOUNT':
            return Object.assign({}, state, { 'account': action.value})
        case 'UPDATE_PASSWORK':
            return Object.assign({}, state, { 'passWork': action.value })
        default:
            return state
    }
}
export default login

redux/index.js: 

import { combineReducers } from 'redux'
import login from './reducers/login' //写法就是单个redux写法,每个功能写一个

const reducer = combineReducers({
    login
})

export default reducer

入口文件:

import React from 'react'
import ReactDOM from 'react-dom'
import '@/styles/index.scss'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import reducer from '@/redux'
import Routers from '@/router/index'

const store = createStore(reducer)
ReactDOM.render(
  <Provider store={store}>
    <Routers />
  </Provider>,
  document.getElementById('root')
)

 登录组件:

import React, { Component } from 'react'
import './login.scss'
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as loginActions from '@/redux/actions/login'

 class Login extends Component {
                 constructor(props) {
                   super(props)
                   this.handleAccount = this.handleAccount.bind(this)
                   this.handlePW = this.handlePW.bind(this)
                   this.handleSubmit = this.handleSubmit.bind(this)
                 }
                 handleAccount(e) {
                   this.props.actions.updateAccount(e.target.value )
                 }
                handlePW(e) {
                  this.props.actions.updatePsW(e.target.value)
                 }
                handleSubmit() { 
                    alert('提交表单')
                }
                 render() {
                   return (
                       <div>
                         <div className="title">
                         <h1>React</h1>
                         </div>
                         <div className="content">
                           <div>
                             <label htmlFor="">账号:</label>
                             <input
                               type="text"
                               value={this.props.state.account}
                               placeholder="请输入账号"
                               onChange={this.handleAccount}
                             />
                           </div>
                           <div>
                             <label htmlFor="">密码:</label>
                             <input
                               type="passwork"
                               value={this.props.state.passWork}
                               placeholder="请输入密码"
                               onChange={this.handlePW}
                             />
                           </div>
                           <div>
                             <button
                                 type="button"
                                 onClick={this.handleSubmit}
                               >
                                 登录
                               </button>
                           </div>
                         </div>
                       </div>
                   )
                 }
               }
//需要渲染什么数据
function mapStateToProps(state) {
  console.log(state,'====Login-dtate')
  return { state:state.login}
}
//1、不使用bindActionCreators时候:
// function mapDispatchToProps(dispatch) {
//   console.log(dispatch, '====Login-Dispatch000000')
//   return {
//     updateAccount: (value) => dispatch({ type: 'UPDATE_ACCOUNT', value}),
//     updatePW: (value) => dispatch({ type: 'UPDATE_PASSWORK', value }),
//   } 
// }
// 2、通过把aciont和dispatch链接起来
function mapDispatchToProps(dispatch) {
  console.log(dispatch, '====Login-Dispatch000000')
  return {
    actions: bindActionCreators(loginActions,dispatch)
  }
}
export default connect(mapStateToProps , mapDispatchToProps)(Login);

即可实现登录账号密码的状态存储 

 

为了实现登录功能,我们需要在Redux中管理用户的认证状态和用户信息。 1. 创建Redux Store 首先,我们需要创建Redux store来管理应用程序的状态。创建一个新的Redux store,使用Redux createStore函数。我们需要定义一个初始状态和一个Reducer函数来处理状态的变化。 ```javascript import { createStore } from 'redux'; const initialState = { user: null, isAuthenticated: false, }; function authReducer(state = initialState, action) { switch (action.type) { case 'LOGIN_SUCCESS': return { ...state, user: action.payload, isAuthenticated: true, }; case 'LOGOUT_SUCCESS': return { ...state, user: null, isAuthenticated: false, }; default: return state; } } const store = createStore(authReducer); ``` 2. 创建Action Creators 我们需要创建Action Creators来触发Redux store中的状态变化。在这个例子中,我们需要创建LOGIN_SUCCESS和LOGOUT_SUCCESS action creators。 ```javascript export function loginSuccess(user) { return { type: 'LOGIN_SUCCESS', payload: user, }; } export function logoutSuccess() { return { type: 'LOGOUT_SUCCESS', }; } ``` 3. 创建登录/注销函数 我们需要创建登录和注销函数,这些函数将调用Action Creators来更新Redux store中的状态。 ```javascript export function login(username, password) { return async (dispatch) => { try { const res = await fetch('/api/login', { method: 'POST', body: JSON.stringify({ username, password }), headers: { 'Content-Type': 'application/json' }, }); if (res.ok) { const user = await res.json(); dispatch(loginSuccess(user)); } else { throw new Error('登录失败'); } } catch (error) { console.error(error); } }; } export function logout() { return async (dispatch) => { try { await fetch('/api/logout'); dispatch(logoutSuccess()); } catch (error) { console.error(error); } }; } ``` 4. 连接Redux store到React组件 最后,我们需要将Redux store连接到React组件,以便我们可以在组件中访问认证状态和用户信息。 ```javascript import { useSelector, useDispatch } from 'react-redux'; import { login, logout } from './actions'; function Login() { const isAuthenticated = useSelector((state) => state.isAuthenticated); const dispatch = useDispatch(); const handleLogin = () => { dispatch(login('username', 'password')); }; const handleLogout = () => { dispatch(logout()); }; return ( <div> {isAuthenticated ? ( <> <p>欢迎回来!</p> <button onClick={handleLogout}>注销</button> </> ) : ( <> <p>请登录!</p> <button onClick={handleLogin}>登录</button> </> )} </div> ); } export default Login; ``` 以上就是一个简单Redux实现登录功能例子。当我们调用login函数时,会向服务器发送请求,如果认证成功,它会调用loginSuccess action creator来更新Redux store中的状态。当我们调用logout函数时,它会调用logoutSuccess action creator来更新Redux store中的状态。在React组件中,我们使用useSelector hook来访问Redux store中的状态,并使用useDispatch hook来调用Action Creators来更新状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值