#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. Привет, последний вопрос, куда я должен поместить элемент выбора пользователя, чтобы получить токен аутентификации?