首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React与功能组件

React与功能组件
EN

Code Review用户
提问于 2020-11-16 23:42:06
回答 1查看 240关注 0票数 3

这是一个非常简单的工作示例,使用React从app.com/user/:userId中选择一个用户,然后从远程API获取/显示该用户的信息。

我可以在网上找到的大多数示例/代码都使用基于类的组件,但是由于我已经有了使用功能方法编写的项目的一部分,所以我正在寻找关于如何将redux集成到功能组件中的反馈。我也不是一个Javascript专家,以任何方式,所以一般的批评,我的JS,以及欢迎!

Store.js:

代码语言:javascript
复制
import { createStore } from "redux";

const initialUser = { user: [] };

const userReducer = (state = initialUser, action) => {
  switch (action.type) {
    case "ADD_USER":
      return Object.assign({}, state, { user: action.user });
    default:
      return state;
  }
};

export default function Store() {
  return createStore(userReducer);
}

Actions.js:

代码语言:javascript
复制
const validResp = (resp) => {
  return resp.data.code === 200;
};

const extractUser = (resp) => {
  return resp.data.data;
};

export const addUser = (resp) => {
  let user = "";

  if (validResp(resp)) {
    user = extractUser(resp);
  }

  return {
    type: "ADD_USER",
    user: user
  };
};

index.js:

代码语言:javascript
复制
import React from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import { BrowserRouter as Router, Route } from "react-router-dom";

import AppContainer from "./AppContainer";
import Store from "./Store";

const rootElement = document.getElementById("root");
ReactDOM.render(
  <Provider store={Store()}>
    <Router>
      <Route path="/user/:userId" component={AppContainer} />
    </Router>
  </Provider>,
  rootElement
);

AppContainer.js:

代码语言:javascript
复制
import React from "react";
import { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { useParams } from "react-router-dom";
import axios from "axios";

import { addUser } from "./Actions";

const baseUrl = "https://gorest.co.in/public-api/users/";

export default function AppContainer() {
  const url = baseUrl + useParams().userId;
  const user = useSelector((state) => state.user);
  const dispatch = useDispatch();

  useEffect(() => {
    axios.get(url).then((resp) => dispatch(addUser(resp)));
  });

  return <App user={user} />;
}

function App(props) {
  return (
    <div className="App">
      Name: {props.user.name} <br />
      id: {props.user.id}
    </div>
  );
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-11-17 03:09:05

简洁的合并对象可以用扩展语法而不是Object.assign来完成。ADD_USER案例可以使用:

代码语言:javascript
复制
return { ...state, user: action.user };

在这里使用扩展语法而不是Object.assign不会产生太大的影响,但是当状态结构变得庞大和复杂时,它会使事情变得非常容易。

函数式编程不会重新分配变量--所有内容都应该用const声明。如果希望更实用,请将addUser更改为使用条件运算符将空字符串或extractUser结果赋值给user变量:

代码语言:javascript
复制
export const addUser = (resp) => {
  const user = validResp(resp) ? extractUser(resp) : "";
  return {
    type: "ADD_USER",
    user
  };
};

(请注意,如果键的名称与值所在的变量相同,则可以使用如上所述的速记属性名称。还可以一次返回整个对象,而无需首先声明一个user变量。)

useEffect错误,因为您没有向useEffect提供依赖数组,因此它的回调将在每次呈现时运行。我很确定这是不可取的-你希望它只运行在最初的渲染,对吗?将一个空依赖项数组传递给useEffect,以便内部的回调只在挂载上运行:

代码语言:javascript
复制
useEffect(() => {
  axios.get(url).then((resp) => dispatch(addUser(resp)));
}, []);

如果axios.get承诺拒绝,则错误处理不会给出任何指示。.catch总是在某个地方做出承诺。你可能想要的东西

代码语言:javascript
复制
useEffect(() => {
  axios.get(url)
    .then((resp) => dispatch(addUser(resp)))
    .catch((error) => dispatch(addError(error.message)));
}, []);

或类似的东西,以表明发生了错误。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/252219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档