Redux中store已经修改,但是页面没有重新渲染

在学习Redex做一个删除项目功能的时候,写出来代码之后调试的时候,在触发删除的时候,store虽然改变了,但是页面并没有发生相对应的变化。
在这里插入图片描述
这里打印出来的内容就是最后返回的state,打印出来的内容是已经改变后的state了,但是页面内容并没有改变。

  • 原因
    Store 会把两个参数传入 reducer: 当前的 state 和 action,所以不能直接修改state,redux会比较新旧state的值,直接修改state会导致store内部的也发生改变,那么新旧state也就没有发生变化。页面就不会重新渲染。

  • 解决方法
    1、Object.assign进行拷贝复制(这里也是用了的)
    2、使用ES6拓展运算符…对store进行浅拷贝(这个就是造成我页面不渲染的原因)

修改之后:
在这里插入图片描述

  • 注意:不要在reducer里面做以下操作
    1、修改传入参数;
    2、执行有副作用的操作,如 API 请求和路由跳转;
    3、调用非纯函数,如 Date.now() 或 Math.random()。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Redux 根组件实现导航栏的页面点击跳转,可以结合 React Router 和 Redux。 首先,安装 React Router 和 React Redux: ```bash npm install react-router-dom react-redux ``` 然后,在根组件使用 `BrowserRouter` 和 `Provider` 包裹应用内容: ```javascript import { BrowserRouter } from 'react-router-dom'; import { Provider } from 'react-redux'; import store from './store'; function App() { return ( <Provider store={store}> <BrowserRouter> {/* 应用的内容 */} <Routes /> </BrowserRouter> </Provider> ); } ``` 在 Redux ,我们需要定义一个 Redux action 和 reducer,用来管理导航栏的当前选项: ```javascript // actions.js export const SELECT_NAV_ITEM = 'SELECT_NAV_ITEM'; export function selectNavItem(item) { return { type: SELECT_NAV_ITEM, payload: item, }; } // reducer.js import { SELECT_NAV_ITEM } from './actions'; const initialState = { selectedNavItem: 'home', }; function rootReducer(state = initialState, action) { switch (action.type) { case SELECT_NAV_ITEM: return { ...state, selectedNavItem: action.payload, }; default: return state; } } export default rootReducer; ``` 在组件使用 `connect` 函数将 Redux store 的 `selectedNavItem` 属性映射到组件的 props : ```javascript import { connect } from 'react-redux'; function Navbar({ selectedNavItem, selectNavItem }) { const handleItemClick = (item) => { selectNavItem(item); }; return ( <nav> <ul> <li className={selectedNavItem === 'home' ? 'active' : ''}> <a href="#" onClick={() => handleItemClick('home')}> 首页 </a> </li> <li className={selectedNavItem === 'about' ? 'active' : ''}> <a href="#" onClick={() => handleItemClick('about')}> 关于我们 </a> </li> </ul> </nav> ); } const mapStateToProps = (state) => { return { selectedNavItem: state.selectedNavItem, }; }; const mapDispatchToProps = { selectNavItem, }; export default connect(mapStateToProps, mapDispatchToProps)(Navbar); ``` 最后,在 `Routes` 组件定义路由规则,并根据 `selectedNavItem` 属性渲染对应的页面: ```javascript import { Route, Switch } from 'react-router-dom'; import Home from './pages/Home'; import About from './pages/About'; function Routes({ selectedNavItem }) { return ( <Switch> <Route path="/" exact> {/* 渲染首页 */} <Home /> </Route> <Route path="/about"> {/* 渲染关于页面 */} <About /> </Route> {/* 其他页面 */} </Switch> ); } const mapStateToProps = (state) => { return { selectedNavItem: state.selectedNavItem, }; }; export default connect(mapStateToProps)(Routes); ``` 这样,当用户点击导航栏的某个项时,会触发 Redux action 更新 `selectedNavItem` 属性,导致页面重新渲染并显示对应的页面内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值