什么是 redux-thunk 的唯一好处?
什么是 redux-thunk 的唯一好处?
我对redux相对较新。我已经阅读了很多文章,但仍然不清楚使用redux-thunk的真正好处是什么。
我所理解的是它允许你从action-creators中返回一个函数,而不是一个对象?但是这有什么好处呢?我创建了一些小的react项目,没有使用redux-thunk。
让我们来看下面的代码片段。它们的行为是相同的。
如果有人可以向我解释或指导我正确的资源以获得更好的理解,那将是非常有帮助的。
使用redux-thunk:
export function fetchContacts(){ return function(dispatch){ axios .get('/contacts') .then( contacts => dispatch({ type: 'FETCH_CONTACTS', payload: contacts})) } }
不使用redux-thunk:
const client = axios.create({ baseURL: "http://localhost:3000", headers: { "Content-Type": "application/json" } }) const url = '/contacts'; export function fetchContacts(){ return { type: 'FETCH_CONTACTS', payload: client.get(url) } }
redux-thunk允许您在分派之前延迟您的操作,以便进行异步调用。假设您正在检索用户设置。常见的用例是分派一个REQUEST_FOR_USER_SETTINGS_IN_PROGRESS操作,以便在应用程序中显示加载程序,然后发出数据的http请求,并在收到响应时分派一个SUCCESS或ERROR操作以更新UI。它看起来可能是这样的:
const requestToGetCoins = await() => { return (dispatch) => { dispatch(requestToGetUserSettingsInProgress()); try{ const users = async httpService.getUserSettings(); dispatch(requestToGetUserSettingsSuccess(users)); } catch(e){ dispatch(requestToGetUserSettingsError(e)); } }; };
只是想强调,在redux中处理异步操作的方法比redux-thunk更好,使用一个临时中间件来处理异步操作并减少大部分样板代码。我建议您查看这个链接:
https://medium.com/_5/minimal-code-for-redux-async-actions-c47ea85f2141
redux-thunk
的唯一好处是允许执行异步操作。在第一个例子中,您将实际由API端点返回的数据发送到reducer。而且只有在服务器返回数据后,才会发送action。在第二个例子中,您发送了一个promise到reducer,这样做是不起作用的,因为您必须在reducer内部解析promise,这违反了reducer应该是纯函数的原则。
问题的原因是在处理异步操作时,redux默认只能处理同步操作,而不能直接处理异步操作。解决方法是使用redux-thunk
中间件,它允许我们在action创建函数中返回一个函数,而不仅仅是一个对象。这个函数可以接收dispatch方法和getState方法作为参数,并且可以在需要时延迟调用dispatch方法。
使用redux-thunk
的好处是我们可以在action中执行异步操作,例如发送网络请求或获取数据。在第一个例子中,我们直接发送实际的数据给reducer,而在服务器返回数据后再发送action,以更新应用程序状态。这样可以确保我们在处理异步操作时不会破坏reducer的纯函数原则。
而在第二个例子中,我们尝试将promise发送给reducer,但这是行不通的,因为reducer只能接收纯对象作为action。通过使用redux-thunk
,我们可以在action创建函数中处理promise,并在promise被解析后再调用dispatch方法发送action。
总之,redux-thunk
的出现是为了解决redux默认只能处理同步操作的问题。它允许我们在action中执行异步操作,从而更好地管理应用程序的状态。
Redux-Thunk的出现是为了解决Redux在处理异步Action Creator时的问题。Redux本身的目的是用于管理应用的状态。它通过调用Action Creator生成Action,然后通过Middleware和Reducers将Action传递给应用的State,最终再由React来展示这个State。这个过程对于同步的变化是没有问题的,但是对于需要从异步渠道获取数据的情况,Redux就无法处理了。
在处理异步Action Creator时,Redux-Thunk发挥作用。Redux-Thunk的目的是给我们对Dispatch方法的直接控制权。Dispatch方法是ReduxStore中包含应用状态的一部分。当我们调用一个Action Creator并返回一个Action时,这个Action最终会被传递给Dispatch方法进行处理。在原始的Redux中,我们在幕后使用了Dispatch方法。
假设我们有一个在actions/index.js文件中的例子,其中我们使用axios库来获取数据:
import axios from 'axios';
export function fetchUsers() {
const request = axios.get('http://somejsondata.com/users');
}
在这个例子中,Redux期望我们返回一个Action,但是我们还没有任何数据。我们必须等待请求完成后才能发送数据给Dispatch方法。这时,我们可以使用Redux-Thunk来处理这个异步Action Creator。
Redux-Thunk提供了另一种返回类型,即一个普通的JavaScript函数。我们可以将Dispatch方法作为参数传递给这个函数,然后在函数内部等待请求完成后再进行Action的派发。具体代码如下:
import axios from 'axios';
export function fetchUsers() {
const request = axios.get('http://somejsondata.com/users');
return (dispatch) => {
request.then(({data}) => {
dispatch({type: 'FETCH_PROFILES', payload: data})
});
};
}
这段代码的意思是,我们会等待请求完成并获取到一定量的数据,然后才会派发一个Action。在这个例子中,Action的type是'FETCH_PROFILES',payload是请求返回的数据。
使用Redux的优势是可以将数据的获取和状态管理集中在一起,使得应用的状态更加可控和可预测。而直接使用axios获取数据的优势是更加简单和直接,没有了Redux的复杂性。具体选择使用哪种方式,取决于应用的具体需求和开发者的偏好。