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

在 React 中使用以下组件时出现问题,用户被添加到导航栏,就好像它是我一样

如何解决在 React 中使用以下组件时出现问题,用户被添加到导航栏,就好像它是我一样

好吧,这很难解释,但我有一个不知道如何修复的错误我有一个 Follow 组件,我在其中调用后端以将用户添加为关注者/关注者。该函数本身可以工作,但是当我更改 dynamicUser 的状态时,该用户会被添加到我的导航栏中,我可以访问配置文件。我正在分享我的整个代码,所以也许你们中的任何人都可以指出我出了什么问题。提前致谢!

关注组件

const Follow = ({ userId,user,setUser }) => {
  const [error,setError] = useState(null);
  const [follow,setFollow] = useState([]);
  const classes = useStyles();

  const handleFollow = (e) => {
    e.preventDefault();
    const accesstoken = localStorage.getItem(CONST.ACCESS_TOKEN);
    axios
      .put(
        `${CONST.SERVER_URL}${PATHS.USER}/${userId}${PATHS.FOLLOW_USER}`,{ user },{ headers: { authorization: accesstoken } }
      )
      .then((response) => {
        console.log("BASH",response);
        setError(null);
        if (!response.status) {
          return setError(response);
        }

        setUser(response?.data);
      })
      .catch((error) => {
        console.log("ERROR",error);
      });
  };

  const handleUnFollow = (e) => {
    e.preventDefault();
    const accesstoken = localStorage.getItem(CONST.ACCESS_TOKEN);
    axios
      .put(
        `${CONST.SERVER_URL}${PATHS.USER}/${userId}${PATHS.UNFOLLOW_USER}`,{ headers: { authorization: accesstoken } }
      )
      .then((response) => {
        console.log("Are you?",response);
        setError(null);
        if (!response.status) {
          return setError(response);
        }
        setUser(response.data);
      })
      .catch((error) => {
        console.log(error);
      });
  };

  return (
    <div>
      {user.following[0] === userId ? (
        <form onSubmit={handleUnFollow}>
          <Button
            className={classes.unFollow}
            variant="contained"
            color="secondary"
            type="submit"
            startIcon={<PersonAdddisabledIcon />}
          >
            UnFollow
          </Button>
        </form>
      ) : (
        <form onSubmit={handleFollow}>
          <Button
            className={classes.follow}
            variant="contained"
            color="primary"
            type="submit"
            startIcon={<PersonAddIcon />}
          >
            Follow
          </Button>
        </form>
      )}
    </div>
  );
};

父组件

const SingleUser = (props) => {
  const { user,setUser } = props;
  const [dynamicUser,setDynamicUser] = useState({});
  const [isLoading,setIsLoading] = useState(true);
  const classes = useStyles();

  useEffect(() => {
    setIsLoading(true);
    axios
      .get(`${CONST.SERVER_URL}/users/${props.match.params.userId}`,{
        headers: { authorization: localStorage.getItem(CONST.ACCESS_TOKEN) },})
      .then((response) => {
        setDynamicUser(response.data);
      })
      .catch((err) => {
        console.log(err.response);
      })
      .finally(() => {
        setIsLoading(false);
      });
  },[props.match.params.userId]);

  if (isLoading) {
    return <LoadingComponent />;
  }
  console.log("DYNAMIC",dynamicUser);
  return (
    <div>
    
        <Grid className={classes.button} raise elevation={3}>
          <Follow userId={dynamicUser._id} user={user} setUser={setUser} />
        </Grid>
)
}

解决方法

这可能会解决问题,或者从错误消息中更清楚地说明问题

// ...

const Follow = ({ userId,user,setUser }) => {
  const [error,setError] = useState(null);
  const [follow,setFollow] = useState([]);
  const classes = useStyles();

  const handleFollow = () => {
    return new Promise(async (resolve,reject) => {
      try {
        const accessToken = localStorage.getItem(CONST.ACCESS_TOKEN);
        const url = `${CONST.SERVER_URL}${PATHS.USER}/${userId}${PATHS.FOLLOW_USER}`
        const response = await axios.put(url,{ user },{ headers: { authorization: accessToken } })
        console.log("BASH",response);
        setError(null);
        if (!response.status) throw response

        setUser(response.data);
        resolve()
      } catch (err) {
        setError(err.response.data)
        console.log("ERROR",err);
        reject(err)
      }
    })
  };

  // try catch blocks are easier to troubleshoot with promises
  const handleUnFollow = () => {
    return new Promise(async (resolve,reject) => {
      try {
        const accessToken = localStorage.getItem(CONST.ACCESS_TOKEN);
        const url = `${CONST.SERVER_URL}${PATHS.USER}/${userId}${PATHS.UNFOLLOW_USER}`
        const response = await axios.put(url,{ headers: { authorization: accessToken } })
        console.log("Are you?",response);
        if (!response.status) throw response
        
        setError(null);
        setUser(response.data);
        resolve();
      } catch (err) {
        console.error(err);
        setError(err.response.data);
        reject(err);
      }
    })
  };

  // i made some purely syntactical changes - i've always felt this was
  // more readable in my own code to wite them out this way
  const hasUserId = user.following[0] === userId
  return (
    <div>
      <form
        onSubmit={async e => {
          e.preventDefault();
          if (hasUserId) {
            await handleUnFollow()
          } else {
            await handleFollow()
          }
        }}
      >
        <Button
          className={hasUserId ? classes.unFollow : classes.follow}
          variant="contained"
          color={hasUserId ? 'secondary' : 'primary'}
          type="submit"
          startIcon={hasUserId ? <PersonAddDisabledIcon /> : <PersonAddIcon />}
        >
          {hasUserId ? 'UnFollow' : 'Follow' }
        </Button>
      </form>
    </div>
  );
};
const SingleUser = (props) => {
  const { user,setUser } = props;
  const [dynamicUser,setDynamicUser] = useState({});
  const [isLoading,setIsLoading] = useState(true);
  const classes = useStyles();

  useEffect(() => {
    return new Promise(async (resolve,reject) => {
      try {
        setIsLoading(true);
        const url = `${CONST.SERVER_URL}/users/${props.match.params.userId}`
        const headers = { authorization: localStorage.getItem(CONST.ACCESS_TOKEN) }
        const response = await axios.get(url,{ headers })
        setDynamicUser(response.data);
        setIsLoading(false);
        resolve()
      } catch (err) {
        console.log(err.response.data);
        reject(err)
      }
    })
    // im not sure what this part does,since useEffect is never called
    // however using promises is much easier to troubleshoot bugged out code
  },[props.match.params.userId]); 

  if (isLoading) {
    return <LoadingComponent />;
  }
  console.log("DYNAMIC",dynamicUser);

  return (
    <div>
      <Grid className={classes.button} raise elevation={3}>
        <Follow userId={dynamicUser._id} user={user} setUser={setUser} />
      </Grid>
    </div>
  )
}

,

所以我最终解决了这个问题,问题实际上出在后端,因为我发送了错误的用户,但现在一切正常。我仍然会把我的代码放在这里,因为 unFollow 似乎有问题。


//follow user
router.put("/:userId/follow",isLoggedIn,async (req,res) => {
  try {
    const user = await User.findById(req.params.userId);

    const currentUser = await User.findById(req.body.user._id);

    const follow = await User.findByIdAndUpdate(
      currentUser,{ $addToSet: { following: user } },{ new: true }
    );
    await User.findByIdAndUpdate(user,{
      $addToSet: { followers: currentUser },});

    return res.json(follow);
  } catch (err) {
    return res.status(500).json({ error: err });
  }
});

//unFollow the user
router.put("/:userId/unFollow",{ $pull: { following: user } },{
      $pull: { followers: currentUser },});

    return res.json(follow);
  } catch (err) {
    return res.status(500).json({ error: err });
  }
});

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