React Router 4 中 URL 更改但视图未更改

2024-04-13

我使用的是react router 4而不是react router 3,所以我使用的是react-router-dom。我试图让 this.props.history.push 工作,但它所做的只是保持视图相同,但 URL 发生了变化。

例如,我单击按钮,它调用一个函数,该函数只调用 this.props.history.push('/posts')。 URL 从 localhost:3000/signin 更改为 localhost:3000/posts。但我仍然处于登录视图中。

但是,如果我点击刷新,它将重定向到帖子页面。我查看了其他问题,这些人无论如何都无法将其转到那里,即使他们刷新或进入网址并按 Enter 键。

我将发布下面的代码来看看我做错了什么。另外,我使用的是 React router v4 而不是 3。我无法使用 browserHistory.push 和 v3 使用的其他东西。

Code:

成分:

import React, { Component } from 'react';
import {Field, reduxForm} from 'redux-form';
import {connect} from 'react-redux';
import * as actions from '../../actions';
import {withRouter} from 'react-router';

class Signin extends Component {
  constructor(props) {
    super(props);

    this.onSubmit = this.onSubmit.bind(this);
  }

  renderField(field) {
    const { meta: {touched, error} } = field;
    const className = `form-group ${touched && error ? 'has-danger' : ''}`;

    return (
      <div className={className}>
        <label><strong>{field.label}:</strong></label>
        <input
          className="form-control"
          type={field.type}
          {...field.input}
        />
        <div className="text-help">
          { touched ? error : ''}
        </div>
      </div>
    )
  }

  onSubmit({email, password}) {
    // this.props.signinUser({email, password}, () => {
      this.props.history.push('/posts');
    // });
  }

  renderAlert() {
    if(this.props.errorMessage) {
      return (
        <div className="alert alert-danger">
          <strong>Oops</strong> {this.props.errorMessage}
        </div>
      )
    }
  }

  render() {
    const { handleSubmit } = this.props;

    return (
      <form onSubmit={handleSubmit(this.onSubmit)}>
        <Field
          label="Email"
          name="email"
          type="email"
          component={this.renderField}
        />
        <Field
          label="Password"
          name="password"
          type="password"
          component={this.renderField}
        />
        {this.renderAlert()}
        <button type="submit" className="btn btn-success">Sign In</button>
      </form>
    );
  }
}

function validate(values) {
  const errors = {};

  //Validate the inputs from values
  if(!values.email) {
    errors.email = "Enter an email!";
  }
  if(!values.password) {
    errors.password = "Enter a password!";
  }
  //If errors is empty, the form is fine to submit
  //If errors has any properties, redux form assumes form is invalid
  return errors;
}

function mapStateToProps(state) {
  return {
    errorMessage: state.auth.error
  };
}

export default reduxForm({
  validate,
  form: 'signin'
})(connect(mapStateToProps, actions)(withRouter(Signin)));

action:

export function signinUser({email, password}, cb) {
  return function(dispatch) {
    axios.post(`${ROOT_URL}/signin`, {email, password})
      .then((response) => {
        dispatch({type: AUTH_USER});
        localStorage.setItem('token', response.data.token);

      })
      .then(() => cb())
      .catch((error) => {
        dispatch(authError(error.response.data.error));
      })
  }
}

我发现问题不在我发布的代码中,而是在我的路线中。确保在路由时没有将路由作为组件嵌套在路由中。例如我有:

const Routes = (
  <Provider store={store}>
    <BrowserRouter>
    <App />
    </BrowserRouter>
  </Provider>
)

这里我将App作为组件导入(或者将其导出为组件),我将其从组件更改为普通函数。为了使这一点更清楚,我将在下面放置旧代码和新代码:

Old:

class App extends React.Component {
 render() {
  return (
   <div>
    <Switch>
      <Route exact path='/' component={Home} />
      <Route path="/signin" component={RequireUnAuth(Signin)} />
      <Route path="/signout" component={Signout} />
      <Route path="/signup" component={Signup} />
      <Route path="/posts" component={Posts} />
    </Switch>
   </div>
  )
 }
}

New:

const App = () => (
   <div>
    <Switch>
      <Route exact path='/' component={Home} />
      <Route path="/signin" component={RequireUnAuth(Signin)} />
      <Route path="/signout" component={Signout} />
      <Route path="/signup" component={Signup} />
      <Route path="/posts" component={Posts} />
    </Switch>
   </div>
  )

这是正在导出的应用程序,一旦我切换到一个简单的函数而不是基于组件的类,一切就都正常了。我不必进行硬刷新,我可以单击“返回”,它会返回,使用 this.props.history.push 进行重定向,等等......

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

React Router 4 中 URL 更改但视图未更改 的相关文章

  • 从旧的外部 Javascript 更改 React 组件的状态?

    如何从旧的 jQuery soup 中更改 React 组件的状态 代码 我有一个这样的组件 var AComponent React createClass getInitialState function return ids rend
  • 在旧浏览器上使用 Fetch 的 ReactJS

    我正在使用 Webpack 和 Babel 实现 React JS 但是 我在让 Fetch 与 IE 11 配合使用时遇到问题 我的 babelrc 文件中有以下内容 presets env stage 0 react 以及我的 webp
  • 有没有办法在 React.render() 函数中渲染多个 React 组件?

    例如我可以这样做 import React from react import PanelA from panelA jsx import PanelB from panelB jsx React render
  • React 在同一组件中渲染多个模态

    我对 React 和一般编码都很陌生 我试图在同一组件中渲染多个模态 但它们都是同时渲染的 因此看起来所有链接都在最后一个模态中渲染文本 这是状态设置的地方 class Header extends React Component cons
  • p5 向量减法“sub”返回错误

    我一直在尝试将 p5 草图上传到 React 构建中 使用react p5 wrapper 我能够成功在屏幕上渲染画布 但是 某些矢量函数会导致错误 var distance this position dist ball position
  • 如何使用draft.js更改光标位置?

    我想知道在键盘命令上完成文本插入后如何更改 Draft js 中的光标位置 因此我目前正在使用 handleKeyCommand cmd 每当用户按下特定按钮时插入自定义文本块 接下来我尝试了以下操作 currentState this s
  • 您在 javascript Web 应用程序中使用的第三方 API ApiKey 存储在哪里?

    如何以及在何处存储您在 javascript Web 应用程序中使用的第三方 API ApiKey 又名 AppId AppSecret AppKey 如果它用于获取 URL 并且在浏览器网络选项卡中可见 我是否应该对其保密 示例 在我的
  • React PropTypes 与 Flow

    PropTypes 和 Flow 涵盖相似的内容 但使用不同的方法 PropTypes 可以在运行时向您发出警告 这有助于快速找到来自服务器等的格式错误的响应 但是 Flow 似乎是未来 并且具有泛型等概念 是一个非常灵活的解决方案 Nuc
  • 使用 React.lazy 时未捕获未定义的错误

    我正在尝试实施基于路由的代码分割 https reactjs org docs code splitting html route based code splitting正如 React 文档中提到的 这是添加延迟实现之前我的应用程序 这
  • React Native:加载图像后应用程序性能不佳

    加载图像似乎没有问题 但是加载完毕后就出现问题了 在我的应用程序中 我在整个游戏中一张一张地加载卡片图像 一旦我加载了 40 张卡片图像 整个应用程序就会变得很慢 它总是发生在第 40 个图像处 当我在第 40 个图像之后继续加载更多卡片图
  • 如何在React中的Material-UI选择框中设置默认值?

    我在用选择框 https material ui com demos selects 来自材料用户界面 我想显示默认选择的 选择值 选项 但之后用户无法选择此选项
  • Redux-saga 从操作中获取数据返回patternOrChannel 未定义

    我需要将动态数据从屏幕发送到操作 减速器 并使用该数据从 API 获取数据 但是当我在我的rootSaga我会收到这样的错误 在检查 take patternOrChannel 时未捕获 patternOrChannel 未定义未捕获在 r
  • 如何正确更新反应钩子状态内的数组

    我一直在尝试更新代表反应状态的数组内的对象 当输入的值更改时应该更新该对象 我可以自己找到一种方法来更新它 但我不太确定这是正确的方法 因为当我打开反应开发工具并转到组件选项卡并单击我正在处理的组件时 在输入输入时状态不会立即更新 并且为了
  • React onSubmit e.preventDefault() 有时不起作用 + Axios

    现在我在 React 中面临这个奇怪的问题 其中带有 e preventDefault 的 onSubmit 函数有时会避免刷新页面 有时则不会 我创建了两个挂钩来跟踪上传的文件及其进度条 const uploadedFiles setUp
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 微前端架构中如何共享redux store?

    我正在尝试创建一个小项目来实现微前端架构 如下微前端 https martinfowler com articles micro frontends html文章 我正在为每个 MFE 微前端 创建多个存储库 并为该应用程序使用 Redux
  • Material-UI 4.8.1 API 更改 - 指定“组件”属性的新方法?

    Edit 这是 4 8 x 的打字错误 升级到 4 9 0 即可解决该问题 上版本4 8 0 以下代码编译并运行良好
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • 如何在react-router-dom@v6中使用私有路由

    我想要将私有路由与react router dom v6一起使用 当我尝试应用身份验证条件时 在 App js 中
  • React.js 和 Ajax 之间的区别

    当我在 google 上搜索 React js 时 我得到的是 React js 是一个用于创建用户界面的框架 如果网站的某个特定部分经常更新 则意味着我们可以使用 React 但我很困惑 Ajax 仅用于此目的 我们可以使用 Ajax 更

随机推荐

  • 如何找到只安装了facebook应用的好友? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在 Facebook 上使用一个应用程序 我想找出仅包含在 Facebook 上安装相同应用程序的朋友的列表 而不是整个朋友列表 我正在
  • 嵌套字典理解python

    我无法理解 Python 3 中的嵌套字典推导式 我从下面的示例中得到的结果输出了正确的结构 没有错误 但只包含内部键 值对之一 我还没有找到像这样的嵌套字典理解的例子 谷歌搜索 嵌套字典理解 python 显示遗留示例 非嵌套理解或使用不
  • 如何长按主页、后退或最近使用的应用程序按钮打开我的 Android 应用程序?

    我希望我的用户能够通过长按后退按钮 最近使用的应用程序按钮或主页按钮来启动我的应用程序 或者甚至长按音量增大 减小或电源按钮 这将允许用户在不触摸屏幕图标的情况下执行我的应用程序 顺便说一句 我提供了与 Google Now 类似的语音解决
  • 将值从一个 jsp 页面传递到另一个 jsp 页面

    我正在将值从数据库检索到 jsp 中的表 到列 我想将该值插入到数据库中的另一个表中 为此 我使用另一个 jsp 表将该值插入到数据库中 并在之前的 jsp 页面表单操作选项卡中调用该 jsp 页面 I use request getPar
  • 时间:2019-03-14 标签:c++

    我正在编写一个 C 应用程序 我有一个类变量 多个线程正在写入该变量 在 C 中 任何可以在编译器 意识到 正在更改的情况下进行修改的内容都需要标记为易失性 对吧 因此 如果我的代码是多线程的 并且一个线程可能写入 var 而另一个线程从中
  • Swift 的标准库和名称冲突

    我知道 Swift 不使用命名空间 但名称是在每个模块中定义的 首先 我不太明白这是如何避免名称冲突的 请随意详细说明 尽管如此 我的主要问题是 假设我想要一个不使用 NSTreeNode 的树结构 所以我创建了自己的类 名为 TreeNo
  • Op 类型未在二进制中注册“SentencepieceEncodeSparse”

    我部署了一个模型 该模型使用 tfhub 模型来使用 docker 进行张量流服务 这是我的模型中包含的 tfhub 模型 https tfhub dev google universal sentence encoder multilin
  • DropboxAPI 入门,未找到类

    我第一次尝试使用 Dropbox API 但在启动应用程序时遇到此错误 Caused by java lang NoClassDefFoundError com dropbox client2 session Session AccessT
  • 异步任务中的异常在 Visual Studio 中被拦截

    我想运行多个任务 其中一些任务可以完成异步 然后等待所有任务完成 由于任务可能会引发异常 因此我想捕获并记录它们 sample code for that static async Task doit int x try Console W
  • 具有条件选择动作的剑道网格列

    这是我得到的 columns Bound t gt t Id Title Template
  • 处理 execvp 的参数数组?

    当我打电话时execvp 例如execvp echo b 其中 b 是命令 a 的参数数组 稍后更改该数组是否会影响之前进行的 execvp 调用 当我尝试调用 execp echo b 时 它最终打印出 null 而不是 b 内部的内容
  • Fetch API:从http响应中获取标题、关键字和正文

    我想知道使用 fetch api 有没有办法在同源发出 XMLHttpRequest 时不发送 cookie https stackoverflow com questions 9028234 is there a way to not s
  • 两指或小指缩放至 osmdroid 中的地图视图

    我需要帮助我正在尝试通过让用户多触摸点 首先是 2 根手指触摸 来缩放地图视图 我知道有 setMultiTouchControls 函数 但这不是我想要做的 我尝试用图片来解释 这比写作更容易 黑色粗体箭头表示手指的移动方向 相反方向也可
  • 如何停止已部署的 docker 堆栈?

    我刚刚完成了初学者 Docker 教程 https github com docker labs blob master beginner chapters votingapp md并想知道如何清理 我使用以下命令部署了一个堆栈和一些不同的
  • Firebase - 在不知道其成员的注册 ID 的情况下删除设备组

    在使用 Firebase 和设备组时 我正在测试令牌 注册 ID 发生更改的情况 例如重新安装应用程序后 但我的逻辑失败了 因为重新安装应用程序后我无法再知道以前存储的令牌 问题是现在我有一个设备组有两个 ghost 我不再知道的注册 ID
  • google +1 按钮向我的网站添加滚动条

    我的网站上有一个 google 1 按钮已经一年多了 一切都运行良好 在过去的几天里 这个按钮开始在我的网站上创建一个水平滚动条 我知道 因为当我删除按钮时 滚动条就会消失 这是我的网站 www kitchen guide co il ht
  • sonarqube 6.6 升级:不可恢复的索引失败

    sonarqube 从 6 5 升级到 6 6 使用 Debian 软件包 后 sonar 无法启动 升级之前我没有更新插件 我只是让标准的 Debian 软件包升级 我正在使用外部数据库 Postgresql 我在 web log 中发现
  • mysql搜索时如何忽略大小写的区别

    mysql搜索时如何忽略大小写的区别 做这样的事情 SELECT user FROM users WHERE UPPER user UPPER moustafa 基本上 您将结果转换为一种大小写 并与也转换为大写的搜索词进行比较 从而有效地
  • 在 C++ 中构造对象的不同方法

    我想使用 C 在堆栈中构造一个对象 你知道这两种调用构造函数的方式 带括号和不带括号 有什么区别吗 a MyClass object b MyClass object 我正在使用 MFC 在为主应用程序构造全局变量时 如果我使用后一种方式
  • React Router 4 中 URL 更改但视图未更改

    我使用的是react router 4而不是react router 3 所以我使用的是react router dom 我试图让 this props history push 工作 但它所做的只是保持视图相同 但 URL 发生了变化 例