Как перенести данные из api в мои элементы списка начальных состояний с помощью инструментария redux?

#reactjs #redux

Вопрос:

В настоящее время я новичок в инструментарии react redux, и теперь я практикуюсь в этом управлении. Прямо сейчас я хочу переместить все данные из моего api в мои редукторы list_remarks начального состояния.

Вопрос: Как или где разместить мой api, чтобы перенести все данные из api в мой список начальных состояний?

Пример API: локальный хост:8000/api/list_remarks

Вот мой CreateSlice:

 import { createSlice } from '@reduxjs/toolkit';

export const RemarksSlice = createSlice({
    name:"check_in_remarks",
    initialState: {
        list_remarks:[],
        check_in_remarks: null,
    },
    reducers: {
        list_remarks: (state, action) => {
            state.remarks = action.payload
        },
        add_check_in_remarks: (state, action) => {
            state.check_in_remarks = action.payload
        }
    }
})

export const { add_check_in_remarks, list_remarks } = RemarksSlice.actions;

export const AddRemarks = (state) => state.check_in_remarks.check_in_remarks;
export const ListRemarks = (state) => state.list_remarks.list_remarks;

export default RemarksSlice.reducer;
 

Комментарии:

1. можете ли вы показать вызывающую часть api

2. @JohnLobo извините, что вы имеете в виду часть вызова api?

3. можете ли вы показать, где вы вызываете api .я не вижу никакого вызова api code.as в соответствии с вашим вопросом,вы хотели установить ответ api в состояние redux, поэтому попросили

4. У меня еще нет вызывающего api, потому что я не знаю, куда мне следует поместить эту функцию, я думаю, что это главная проблема для решения моего вопроса. вы можете мне в этом помочь? как создать этот вызывающий api?

Ответ №1:

Вы можете использовать createAsyncThunk ссылку:https://redux-toolkit.js.org/api/createAsyncThunk

Я могу предоставить вам базовый фрагмент, который может вам помочь

 export const getPosts = createAsyncThunk(
    'posts/getPosts',

    async (arg, { dispatch, getState, extra, requestId, signal, rejectWithValue }) => {
      
        return fetch(
            `https://jsonplaceholder.typicode.com/posts?_limit=${arg.limit}`
        ).then((res) => {
            if (!res.ok) {
                
                return rejectWithValue([], "api url not found from");
            }
            return res.json()
        }).catch(error => {
           
            return rejectWithValue([], error);
           
        })
    }

)
 

В createSlice

     export const RemarksSlice = createSlice({
    name:"check_in_remarks",
    initialState: {
        list_remarks:[],
        check_in_remarks: null,
status :null
    },
    reducers: {
        list_remarks: (state, action) => {
            state.remarks = action.payload
        },
        add_check_in_remarks: (state, action) => {
            state.check_in_remarks = action.payload
        }
    },
     extraReducers: {

        [getPosts.pending]: (state, action) => {
          
            state.status = 'loading'
        },
        [getPosts.fulfilled]: (state, { payload, meta }) => {

          
            state.list_remarks = payload
            state.status = 'success'
        },
        [getPosts.rejected]: (state, action) => {
            state.status = 'failed'
        },
    }
})
 

Чтобы отправить из любого места использования или в любом месте, которое вы хотели, затем

  React.useEffect(() => {
        dispatch(getPosts({ limit: 5 }));
       
    }, [])
 

Комментарии:

1. Привет, мой последний вопрос, использование этого createAsyncThunk в реальном времени? допустим, когда я добавлю новый элемент, он автоматически отобразит его в списке?

2. если вы видите документ :функция, которая принимает строку типа действия Redux, и функция обратного вызова, которая должна возвращать обещание. Он генерирует типы действий жизненного цикла обещания на основе префикса типа действия, который вы передаете, и возвращает создателя действия thunk, который выполнит обратный вызов обещания и отправит действия жизненного цикла на основе возвращенного обещания.

3. он будет звонить всякий раз, когда вы отправите

4. Привет, последний вопрос, куда я должен поместить элемент выбора пользователя, чтобы получить токен аутентификации?

5. в вашем компоненте, где вы хотите использовать токен аутентификации

Ответ №2:

добавьте метки набора действий и ошибку установки:

 reducers: {
...
   // Getting a list of remarks in a store
   setRemarks: (state, action) => {
      state.remarks = action.payload
   }
   // In case of problems with receiving, we will add an error to the store.
   setError: (state, action) => {
      state.error = action.payload
   }
... 
}
 

и добавьте asyncThunk (о функции createAsyncThunk):

    export const fetchRemaks = createAsyncThunk(
   'remarks/fetch',
   async (_, {dispatch}) => {
    // here is your receiving remarks function
    fetch('https://jsonplaceholder.typicode.com/todos/1')
        .then(response => response.json())
        .then(remarks => dispatch(setRemarks(remarks)))
        .catch(error => dispatch(setError(error)))
   }
)
 

Как использовать:

 export default function App() {
  
  const [loading, setLoading] = useState(false)
  const dispatch = useDispatch()
  const { error } = useSelector(state => state.remarks)
  useEffect(() => {
    setLoading(true)
    dispatch(fetchRemaks())
    setLoading(false)
  })

  return (
    <div className="App">
     {error amp;amp; <b>{error}</b>}
     {loading 
        ? 'loading...'
        : 'remarks'
     }
    </div>
  );
}
 

Комментарии:

1. Привет, мне нужно экспортировать этот fetchRemaks?

2. вы можете создать отдельный asyncAction.js файл и экспортируйте из него это асинхронное действие

3. Как использовать: как обычное действие в крючке useEffect

4. Привет, мой последний вопрос, использование этого createAsyncThunk в реальном времени? допустим, когда я добавлю новый элемент, он автоматически отобразит его в списке?

5. Привет, последний вопрос, куда я должен поместить элемент выбора пользователя, чтобы получить токен аутентификации?