реагировать, как сделать повторный рендеринг для обновления значения в локальном хранилище - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь показать счетчик с процентным значением, когда в моем приложении реакции есть загрузка файла. Для этого я использую материал UI круговой прогресс . Поэтому я сделаю вызов отдыха, используя Ax ios, и настрою его так, чтобы он давал мне процентные значения и сохранял их в локальном хранилище. Код для моего вызова rest выглядит так:

callRestService(URL,postBody){
 const config = {
    onUploadProgress: function(progressEvent) {
    var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
    console.log(percentCompleted);
    localStorage.setValue('percentage',''+percentCompleted);
   }
 }
 axios.post(URL, postBody, config)
    .then(res => console.log(res))
    .catch(err => console.log(err))
}

А фрагмент кода для компонента счетчика:

export default function CircularProgressWithLabel(props) {
  const initialPercentage = () => Number(localStorage.getItem('percentage') || 0);
  const [percent,setPercent] = React.useState(initialPercentage);
  React.useEffect(() => {
    setPercent(Number(localStorage.getItem('percentage')));
  },[localStorage.getItem('percentage')])
  return (
    <Box position="relative" display="inline-flex">
      <CircularProgress variant="static" {...props} />
      <Box
        top={0}
        left={0}
        bottom={0}
        right={0}
        position="absolute"
        display="flex"
        alignItems="center"
        justifyContent="center"
      >
        <Typography variant="caption" component="div" color="textSecondary">
          {percent}
        </Typography>
      </Box>
    </Box>
  );
}

Я использую эти два вспомогательных метода в родительском компоненте в этом способ:

function mainComponent(){
  ...
  const [loading,setLoading] = React.useState(false);
  ...
  // this function will be called when a button is clicked.
  async function importFile(){
    setLoading(true);
    await callRestService('endpontURl',data);
    setLoading(false);
  }

  ...

  return{
    ...

    { loading && <CircularSpinner/> }
  }
}

Теперь проблема в том, что компонент прядильщика отображается только один раз, то есть всякий раз, когда я устанавливаю хук loading в значение true, и поскольку начальное значение для процента в круговом прядильщике ноль, он не покажет компонент прядильщика. Но позже я обновляю значение localStorage в callRestService и использую useEffect, который прослушивает значение localStorage в компоненте счетчика, я ожидал, что компонент счетчика будет отображаться каждый раз, когда значение обновляется в callRestService, но этого не происходит. Итак, может ли кто-нибудь помочь мне с этим, я хотел бы отображать компонент прядильщика каждый раз, когда происходит обновление значения в локальном хранилище, тем самым предоставляя способ получить последнее загруженное процентное значение. Или есть альтернатива для предоставления значения, возвращаемого Ax ios в компоненте callRestService, компоненту прядильщика.

1 Ответ

2 голосов
/ 14 июля 2020

компонентов обычно отображаются с изменением состояния, вы можете привязать одно состояние к локальному хранилищу (если вам все равно нужно локальное хранилище) и просто обновлять состояние каждый раз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...