简体   繁体   English

当api在react js中使用axios成功时,我可以使用多个useState并设置数据吗?

[英]Can I use multiples useState and set data when api's got success using axios in react js?

Can I use multiples useState like this?我可以像这样使用倍数useState吗? Actually this code is working but I want to clean it.实际上这段代码是有效的,但我想清理它。

const [shareCode, setShareCode] = useState();
const [createdBy, setCreatedBy] = useState();
const [className, setClassName] = useState();
const [subjectName, setSubjectName] = useState();
const [avatar, setAvatar] = useState();
const [startDate, setStartDate] = useState();
const [endDate, setEndDate] = useState();
const [quizStatus, setQuizStatus] = useState();

useEffect(() => {
    commonApiCall(`url${var}`, {}, 'get').then((response) => {
        if (response.status_code == 200) {
            setShareCode(response.response.quiz.share_code)
            setCreatedBy(response.response.quiz.created_by)
            setClassName(response.response.quiz.class_id)
            setSubjectName(response.response.quiz.subject_meta.subject_name)
            setAvatar(response.response.quiz.image_avatar.image_path)
            setStartDate(response.response.quiz.start_date)
            setEndDate(response.response.quiz.end_date)
            setQuizStatus(response.response.quiz.status)
        }
    }).catch((error) => {
        console.log(error)
    })
}, [])
function commonApiCall(url, data, method) {
    const token = localStorage.getItem("token")
    return axios({
        method: method,
        url: url,
        data: data,
        headers: {
            "Authorization": token
        }
    })
}

export default function QuizDetails() {
    return (
        <div>
            <div>{shareCode}</div>
            <div>{createdBy}</div>
            <div>{className}</div>
            <div>{subjectName}</div>
            <div>{avatar}</div>
            <div>{startDate}</div>
            <div>{endDate}</div>
            <div>{quizStatus}</div>
        </div>
    )
}

You can use as much useState hooks as you would like.您可以根据需要使用尽可能多的 useState 挂钩。

May I just suggest to use a useReducer hook for these kinda scenarios.我可以建议在这些场景中使用 useReducer 钩子。 That way you can set multiply states at once.这样你就可以一次设置多个状态。

I can share a great article by ROBIN WIERUCH.我可以分享 ROBIN WIERUCH的一篇很棒的文章

Because the code is to long for a post I will just share the reducer function to prove a point.因为代码太长了,我只分享reducer function来证明一点。

  switch (action.type) {
    case 'FETCH_INIT':
      return {
        ...state,
        isLoading: true,
        isError: false
      };
    case 'FETCH_SUCCESS':
      return {
        ...state,
        isLoading: false,
        isError: false,
        data: action.payload,
      };
    case 'FETCH_FAILURE':
      return {
        ...state,
        isLoading: false,
        isError: true,
      };
    default:
      throw new Error();
  }
};

As you can see multiple properties in a state are set by just dispatching one action.正如您所见,state 中的多个属性只需调度一个操作即可设置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM