Redux-toolkit异步操作实现
reducer分片文件
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
export const fetchData = createAsyncThunk(
'data/fetchData',
async (url, thunkAPI) => {
const response = await fetch(url);
const data = await response.json();
return data;
}
);
const dataSlice = createSlice({
name: 'data',
initialState: {
data: [],
loading: false,
error: null
},
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchData.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchData.fulfilled, (state, action) => {
state.loading = false;
state.data = action.payload;
})
.addCase(fetchData.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
});
}
});
export default dataSlice.reducer;
创建store的文件
import { configureStore } from "@reduxjs/toolkit";
import dataReducer from './dataSlice';
const store = configureStore({
reducer: {
data: dataReducer
}
});
export default store;
组件中使用
import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { fetchData } from "./dataSlice";
function App() {
const dispatch = useDispatch();
const { data, loading, error } = useSelector(state => state.data);
useEffect(() => {
dispatch(fetchData('https://jsonplaceholder.typicode.com/posts'));
}, [dispatch]);
if (loading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error}</div>;
}
return (
<div>
<h1>Fetched Data:</h1>
<ul>
{}
{data.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
export default App;
jsonplaceholder.typicode.com
jsonplaceholder.typicode.com 是一个免费的在线 REST API 服务,提供了模拟的、可用于开发和测试的 JSON 数据。它不需要认证,完全可以直接用于前端开发中,模拟和测试与后端 API 的交互。
基本使用
这个 API 提供了一些常见的资源,例如 posts(文章)、users(用户)、comments(评论)等。你可以通过不同的 HTTP 请求(GET、POST、PUT、DELETE)来操作这些资源。
可用的资源
以下是 jsonplaceholder 提供的一些常用资源和它们的基本用法:
1. Posts (文章)
获取所有文章:
GET https://jsonplaceholder.typicode.com/posts
获取单个文章:
GET https://jsonplaceholder.typicode.com/posts/{id}
例如:
GET https://jsonplaceholder.typicode.com/posts/1
2. Users (用户)
获取所有用户:
GET https://jsonplaceholder.typicode.com/users
获取单个用户:
GET https://jsonplaceholder.typicode.com/users/{id}
例如:
GET https://jsonplaceholder.typicode.com/users/1
3. Comments (评论)
获取某个文章的评论:
GET https://jsonplaceholder.typicode.com/posts/{postId}/comments
例如:
GET https://jsonplaceholder.typicode.com/posts/1/comments
4. Todos (待办事项)
获取所有待办事项:
GET https://jsonplaceholder.typicode.com/todos
获取单个待办事项:
GET https://jsonplaceholder.typicode.com/todos/{id}
5. Albums (相册)
获取所有相册:
GET https://jsonplaceholder.typicode.com/albums
获取单个相册:
GET https://jsonplaceholder.typicode.com/albums/{id}
6. Photos (图片)
获取所有图片:
GET https://jsonplaceholder.typicode.com/photos
获取单个图片:
GET https://jsonplaceholder.typicode.com/photos/{id}
7. Todos (待办事项)
获取所有待办事项:
GET https://jsonplaceholder.typicode.com/todos
获取单个待办事项:
GET https://jsonplaceholder.typicode.com/todos/{id}
使用示例
使用 fetch API 从 jsonplaceholder 获取数据
在前端开发中,你通常使用 fetch 或 axios 来发起请求。以下是使用 fetch 从 jsonplaceholder 获取所有的 posts 示例:
js
复制代码
fetch('https://jsonplaceholder.typicode.com/posts')
.then(response => response.json())
.then(data => { console.log(data);
.catch(error => { console.error('Error fetching data:', error); });
js
复制代码
import axios from 'axios';
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => { console.log(response.data);
.catch(error => { console.error('Error fetching data:', error); });
模拟 POST 请求
你可以模拟向 jsonplaceholder 提交数据(例如:创建文章、用户等)。这里是如何发送一个 POST 请求:
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: 'My New Post',
body: 'This is the content of the post.', userId: 1 }) })
.then(response => response.json())
.then(data => { console.log('New post created:', data); })
.catch(error => { console.error('Error creating post:', error); });