微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在异步模式下获取数据时如何在useEffect中使用Callback

如何解决在异步模式下获取数据时如何在useEffect中使用Callback

谁能帮我解决这个问题 实际上我正在尝试添加 useCallback 函数,但它似乎无法正常加载 不显示任何数据 每次我更改页面并返回“用户”网址时,它都会开始重新呈现 请帮我解决这个问题 如果有人可以帮助我,我会帮助我。

这是我的沙盒链接 CodeSandbox for live

但我使用的是我自己的 django 服务器

我的 Store.js 这是我创建的商店

    import React,{ createContext,useEffect,useReducer } from "react";
import axios from "axios";
import { BlogReducer } from "./Reducer/Reducer";

const url = "http://localhost:8000/api/";
export const MyData = createContext();
axios.defaults.baseURL = url;
axios.defaults.withCredentials = true;
const Store = ({ children }) => {
  const initialState = {
    posts: [],users: [],user: {},loading: true,error: false,addUsers: async (value) => {
      const data = await axios.post(url,value);
      dispatch({
        type: "ADD_ARTICLE",payload: data,});
    },reset: () => {
      dispatch({
        type: "REST_ARTICLE",};
  const [state,dispatch] = useReducer(BlogReducer,initialState);
  return (
    <MyData.Provider value={{ state,dispatch }}>{children}</MyData.Provider>
  );
};

export default Store;

我的 App.js 我使用的是 react-router-dom 。

我的 App.js

import { browserRouter as Router,Route,Switch } from "react-router-dom";
    function App() {
  return (
    <Router>
      <MyNavbar />
      <Store>
        <Switch>
          <Route exact component={UsersList} path="/users" />
        </Switch>
      </Store>
      <MyFooter />
    </Router>
  );
}

我的 Reducer.js

    import { UserConst } from "../Const/userConst";
export const BlogReducer = (state,{ type,payload }) => {
  switch (type) {
    case UserConst.ON_USERS_LIST_LOADING:
      return { ...state,error: false };
    case UserConst.ON_USERS_LIST_FAIL:
      return { ...state,loading: false,error: true };
    case UserConst.ON_USERS_LIST_SUCCESS:
      return { ...state,users: payload,error: false };
    case UserConst.ON_USER_REMOVE:
      const newUserList = state.users.filter((user) => user.id !== payload);
      return { ...state,users: newUserList };
    default:
      return state;
  }
};

我的 UsersList.js

    import React,{ useContext,useRef,useState } from "react";
    import { MyData } from "../Store";
    import axios from "axios";
    import { UserConst } from "../Store/Const/userConst";
    import { Link } from "react-router-dom";
    import { Table,Modal } from "react-bootstrap";
    import DeleteIcon from "@material-ui/icons/Delete";
    import EditIcon from "@material-ui/icons/Edit";
    import Button from "@material-ui/core/Button";
    import Tooltip from "@material-ui/core/Tooltip";
    import { List,ListItem } from "@material-ui/core";
    import ListItemAvatar from "@material-ui/core/ListItemAvatar";
    import ListItemText from "@material-ui/core/ListItemText";
    const UsersList = () => {
    const { state,dispatch } = useContext(MyData); //state value
    const getUsersData = async () => {
    try {
      dispatch({
        type: UserConst.ON_USERS_LIST_LOADING,});
      const response = await axios.get("users");
      const users = await response.data.data;
      dispatch({
        type: UserConst.ON_USERS_LIST_SUCCESS,payload: users,});
    } catch (error) {
      dispatch({
        type: UserConst.ON_USERS_LIST_FAIL,});
    }
    };
   

    useEffect(() => {
     getUsersData();
    },[]);

    const actions = (id) => {
    return (
      <>
        <Tooltip title="Delete" arrow>
          <Button variant="outlined">
            <DeleteIcon color="action" onClick={() => deleteHandler(id)}>
              Delete
            </DeleteIcon>
          </Button>
        </Tooltip>
        <Tooltip title="Edit" arrow>
          <Link to={`/users/${id}/edit`}>
            <Button variant="outlined">
              <EditIcon color="primary">Edit</EditIcon>
            </Button>
          </Link>
        </Tooltip>
      </>
    );
    };
    const deleteHandler = async (id) => {
    await axios.delete(`users/${id}`);
    setSearchData((people) => {
      return people.filter((person) => person.id !== id);
    });
    dispatch({
      type: UserConst.ON_USER_REMOVE,payload: id,});
  };
    const inputRef = useRef(null);
    const [show,setShow] = useState(false);
    const handleClose = () => setShow(false);
    const handleShow = () => {
    setShow(!show);
    };
    useEffect(() => {
    if (show === true) {
      inputRef.current.focus();
    }
  

      },[show]);
       const [search,setSearch] = useState(""); // input field
       const [searchData,setSearchData] = useState([]); //the data what we want
       const url = `users?search=${search}`; //search URL
       return (
        <div>
          {state.loading ? (
            <h3>Loading....</h3>
          ) : state.error ? (
            <h3>Error</h3>
          ) : (
            <>
              <div className=" text-right">
                <Button onClick={handleShow}>Search</Button>
              </div>
              <div>
                <Modal
                  keyboard={true}
                  show={show}
                  onHide={handleClose}
                  backdrop="static"
                >
                  <Modal.Header closeButton>
                    <Modal.Title>Search User</Modal.Title>
                  </Modal.Header>
                  <Modal.Body>
                    <input
                      ref={inputRef}
                      name="search"
                      onChange={async (e) => {
                        setSearch(() => e.target.value);
                        const response = await axios.get(url);
                        const data = await response.data.data;
                        setSearchData(data);
                      }}
                      value={search}
                    />
                    <List>
                      {searchData.map((data) => {
                        return (
                          <ListItem key={data.id}>
                            <ListItemAvatar>{actions(data.id)}</ListItemAvatar>
                            <ListItemText className="ml-2">
                              {data.email}
                            </ListItemText>
                            <ListItemText>@{data.username}</ListItemText>
                          </ListItem>
                        );
                      })}
                    </List>
                  </Modal.Body>
                  <Modal.Footer>
                    <Button variant="secondary" onClick={handleClose}>
                      Close
                    </Button>
                  </Modal.Footer>
                </Modal>
              </div>
              <Table striped bordered hover size="sm">
                <thead>
                  <tr>
                    <th>#</th>
                    <th>Name</th>
                    <th>Email</th>
                    <th>Username</th>
                    <th></th>
                  </tr>
                </thead>
                <tbody>
                  {state.users.map((user) => {
                    return (
                      <tr key={user.id}>
                        <td>{user.id}</td>
                        <td>
                          {user.first_name} {user.last_name}
                        </td>
                        <td>{user.email}</td>
                        <td>@{user.username}</td>
                        <td>{actions(user.id)}</td>
                      </tr>
                    );
                  })}
                </tbody>
              </Table>
             </>
           )}
          </div>
         );
       };
    
        export default UsersList;

请帮助我在每次更改“用户”网址时停止重新渲染状态

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。