通过redux改变状态后如何更新React组件?

2024-01-11

我正在学习 React 和 Redux,在学习的同时,我决定制作一个带有按钮的网页,单击该按钮就会改变状态。在按钮下方,我想在不同的组件中显示当前状态。虽然单击按钮会更改状态,但它不会反映在组件中。这是我的代码:

App.js

import React from 'react'
import Name from './Name'
import {changeName} from './Action'; 

export default function App () {  
      return (
          <div>
            <button onClick={changeName}>Click me</button>
            <Name />
          </div>
      )
}

Name.js

import React from 'react'
import {store} from './Store'

function Name(props) {
    return (
        <div>           
            My name is: {store.getState()}
        </div>
    )
}

export default Name

Store.js

import { createStore } from 'redux';
import {reducer} from './Reducer';

export const store = createStore(reducer, 'Tarun');

Action.js

import {store} from './Store';

export const changeName = () => {
    if (store.getState() === "Tarun"){
        store.dispatch({ type: 'name', payload: 'Subhash' });
    }
    else{
        store.dispatch({ type: 'name', payload: 'Tarun' });
    }
}

减速器.js

export const reducer = function(state, action) {
    if (action.type === 'name') {
      return action.payload;
    }
    return state;
};

当我单击按钮时,名称组件内的文本不会更改。问题是什么?


您需要按照 Redux 文档正确设置您的减速器和初始存储。

你缺少一个Provider,这将为您提供store到您的应用程序。

const store = createStore(reducer, applyMiddleware(thunk));

const rootElement = document.getElementById("root");

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  rootElement
);

现在,您的商店可供您的组件使用。

Your reducer也需要一个初始状态,并且您始终应该返回状态的更新副本。也就是说,不要直接更改状态,而是制作一个副本,更改它,然后返回该副本。

const initialState = {
  name: ""
};

const reducer = function(state = initialState, action) {
  if (action.type === "name") {
    return { ...state, name: action.payload };
  } else {
    return state;
  }
};

export default reducer;

您可能已经注意到,我在您的商店中添加了一个中间件,这是因为在您的操作中访问当前减速器的状态时通常需要这样做。也就是说,我为此安装了 redux-thunk,所以在你的操作中,你可以有这样的东西:

export const changeName = () => {
  return (dispatch, getState) => {
    if (getState().name === "Tarun") {
      dispatch({ type: "name", payload: "Subhash" });
    } else {
      dispatch({ type: "name", payload: "Tarun" });
    }
  };
};

现在,随着您的商店被提供给您的应用程序、您的减速器已完成且您的操作已准备就绪,您可以将不同的组件连接到您的减速器。

您使用高阶组件react-redux called connect为了那个原因。例如,在你的Name组件,我们可以通过将状态映射到组件的 props 来将要显示的名称连接到您的化简器:

function Name(props) {
  return <div>My name is: {props.name}</div>;
}

const mapStateToProps = state => {
  return {
    name: state.name
  };
};

export default connect(mapStateToProps)(Name);

这里的好处是您还可以将第一个参数保留在connect高阶组件为空,只传递第二个组件,这将是调度函数。好吧,这就是你在你的App组件,您可以将其连接到changeName action.

function App(props) {
  return (
    <div>
      <button onClick={props.changeName}>Click me</button>
      <Name />
    </div>
  );
}

const mapDispatchToProps = dispatch => {
  return {
    changeName: () => dispatch(changeName())
  };
};

export default connect(
  null,
  mapDispatchToProps
)(App);

现在,当应用程序发送一个changeName操作时,您的减速器状态将被更新,并且连接到减速器状态的其他组件将重新渲染。

摘要: 尝试将您的商店想象为一罐空糖果。你的罐子一开始是空的,但不同的操作可能会改变罐子里的东西。最重要的是,房子里的不同人知道罐子在哪里,就可以去拿一些糖果。转化为您的问题,您的应用程序以空名称开始,并且您有一个设置名称的操作。通过以下方式知道在哪里可以找到该名称的组件连接的您的减速器将知道该名称何时更改并获得更新的名称。

最终代码可以在这里找到:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过redux改变状态后如何更新React组件? 的相关文章

随机推荐

  • 如何使滚动超过某个点后出现浮动菜单? [复制]

    这个问题在这里已经有答案了 我想让四个菜单选项卡在您滚动经过页面上的某个点 例如 1000px 后出现 我希望它们出现时从左向右滑入 这就是我想要的 但位于浏览器的左侧 任何意见都会受到赞赏 首先 您需要从跟踪页面的滚动开始 其次 您需要在
  • 重定向到 ASP.NET Core 的自定义“访问被拒绝”页面

    我正在编写一个使用 Windows 身份验证的 ASP NET Core 1 0 网站 我已经实现了授权并且正在按预期工作 目前 当给定用户的身份验证失败时 会显示通用的 HTTP 403 错误页面 如何配置 ASP NET Core 以便
  • 如何在 .NET 4.0 中使用代码契约而不让我的代码看起来混乱?

    我已经开始使用代码契约 并发现很难立即发现方法的 本质 以这个 非常简单 为例 public static void UserAddNew string domain string username string displayName C
  • 删除查询字符串和参数

    由于不值得在这里讨论的原因 Google 一直在为我的一个网站编制索引 其中 URL 中包含不必要的查询字符串 这些字符串是wordfence lh hid and wordfence logHuman 我想修改我的 htaccess文件以
  • Laravel 5 Seeder - 数据库中的多行

    我想知道是否可以像这样插入多行 或类似的东西
  • 我网站中所有页面的网站图标

    我了解到为网页添加网站图标的方法是在页面中添加以下几行 我应该在我网站的每个页面中添加此代码吗 我使用 Apache tomcat 集群来提供页面服务 还有其他简单的方法可以做到这一点吗 通常将一个名为 favicon ico 的文件放在网
  • 如何查看 Node.js Cloud Function 环境的文件系统性质?

    当我将 Cloud Function 部署到 GCP 用 Node js 编写 时 如何查看我的文件系统环境以进行调试 如果我想知道我当前的目录是什么或者我的应用程序旁边有哪些文件怎么办 当我们部署 Cloud Function 时 就会出
  • redux-observable 史诗,不发送任何新操作

    可能我是一个菜鸟 还没有完全理解这些东西应该如何工作 但是我在 redux observable 中有一个史诗 我想用它来创建一个承诺 它将分派一个动作并等待一个解决之前采取不同的行动 我通过将操作映射到来使其工作 IGNORE 但我真的不
  • 将 JSON 对象数组映射到 java.util.Map,反之亦然

    问题是如何将 JSON 对象数组映射到java util Map其中每个键都是对象的某个指定属性 值是对象本身 JSON items field1 1 field2 Hello field1 2 field2 World Java POJO
  • 扭曲的http客户端

    我正在寻找一个描述 Twisted 的 HTTP 客户端用法的示例 看完优秀的关于 Twisted 内部结构的博客文章 http krondo com blog page id 1327 我了解 工厂 和 协议 组件如何发挥作用 但我不清楚
  • 在键盘上方显示整个底部工作表并使用 EditText

    我正在实现一个 UI 其中底部工作表将出现在键盘上方 并带有一个 EditText 供用户输入值 问题是视图与键盘部分重叠 覆盖了底部工作表的底部 这是底页 没有键盘 这是显示键盘的底页 确保显示整个底页的最佳方法是什么 Thanks 只是
  • 如何将 JQuery Datepicker 与 Django 模板语言结合使用

    看着这个链接 https stackoverflow com questions 9594081 how to use jquery ui datepicker as a django widget并找到了一些帮助 但我想知道如何选择对 m
  • 如何学习 Jackson 来转换抽象类的继承者?

    我有一堂课 EqualsAndHashCode callSuper true Data public class AppealTemplateDto extends AbstractDto private List
  • 为什么我在尝试批量打印变量时收到“Echo is on”

    我尝试执行一个简单的批处理文件脚本 echo 1 set var 1 echo var 当我在 XP 中运行它时 它给出了预期的输出 但是当我在 Vista 或 Windows 7 中运行它时 我在尝试打印 回显 值时收到 Echo is
  • 在 MATLAB 中仅查找相关点

    我有一个 MATLAB 函数可以查找样本中的特征点 不幸的是 它仅在大约 90 的时间内有效 但是 当我知道应该查看样本中的哪些位置时 我可以将其提高到几乎 100 所以我想知道MATLAB中是否有一个函数可以让我找到大部分结果所在的范围
  • GetPrivateProfileInt-仅读取默认值

    我正在尝试读取 C 中包含内容的 init 配置文件 IP地址 IP地址 169 254 115 22 扫描配置 扫描频率 2500 扫描分辨率 2500 起始角度 700000 停止角度 1100000 到目前为止 我已经使用这段代码来读
  • 有效检查数据帧是否具有范围内的日期,并返回计数

    假设我们有一个数据框df包含按日期按时间顺序排列的日期列表 目标是获取给定日期内包含给定日期的日期范围的人数 df pd DataFrame data date datetime date 2007 12 1 datetime date 2
  • 在启用 IAM 登录的情况下通过 cloud-sql-proxy 从 Cloud Run 连接到 Cloud SQL

    我想使用服务帐号从 Cloud Run 连接到 Cloud SQL 实例 连接过去是在 VPC 内创建的 我们只需提供一个带有user and a password到我们的 PostgreSQL 客户端 但现在我们希望身份验证由 Googl
  • 在 lubuntu 15.04 上构建 Kurento

    我正在尝试在我的 lubuntu 15 04 上构建整个 Kurento 与 ubuntu 15 04 相同 但 UI 不同 我首先克隆所有存储库 mkdir kurento cd kurento git clone https githu
  • 通过redux改变状态后如何更新React组件?

    我正在学习 React 和 Redux 在学习的同时 我决定制作一个带有按钮的网页 单击该按钮就会改变状态 在按钮下方 我想在不同的组件中显示当前状态 虽然单击按钮会更改状态 但它不会反映在组件中 这是我的代码 App js import