gpt4 book ai didi

javascript - 将函数从纯 React 转换为 Redux React

转载 作者:行者123 更新时间:2023-12-03 13:40:31 24 4
gpt4 key购买 nike

在纯 react 中,我编写了一个在 componentDidMount () 中调用的函数:

  getTasks = (userId, query, statusTask, pageNumber) => {
let check = {};
axios({
url: `/api/v1/beta/${userId}`,
method: 'GET'
})
.then(res => {
check = res.data;

if (res.data) {
this.setState({
checkRunning: res.data,
checkRunningId: res.data.id
});
this.utilizeTimes(res.data.task_id);
}
})
.catch(error => {
console.log(error);
})
.then(() => {
const params = {
sort: 'name'
};

if (query) {
params['filter[qwp]'] = query;
if (this.state.tasks[0]) {
this.setState({
selectedId: this.state.tasks[0].id,
selectedTabId: this.state.tasks[0].id
});
}
}

axios({
url: '/api/v1//tasks',
method: 'GET',
params
})
.then(res => {
if (res.status === 200 && res.data) {
this.setState({
tasks: res.data,
lengthArrayTasks: parseInt(res.headers['x-pagination-total-count'])
});

if (!check && res.data && res.data[0]) {
this.setState({
selectedTabId: res.data[0].id,
});

this.load(res.data[0].id);
}

let myArrayTasks = [];
myArrayTasks = res.data;
let findObject = myArrayTasks.find(task => task.id === this.state.runningTimerTask.id);

if (
!findObject &&
this.state.runningTimerTask &&
this.state.runningTimerTask.id &&
this.state.query === ''
) {
this.setState({
tasks: [this.state.runningTimerTask, ...myArrayTasks]
});
}
}
})
.catch(error => {
console.log(error);
});
});
};

我正在尝试将其重写为 redux,但结果很差。首先它发出一个请求/api/v1/beta/${userId},并将答案写入变量check中。 check 传递到下一个then。在接下来的then中执行请求'/api/v1//tasks'有人可以帮助我吗?我正在寻求一些提示。这有点复杂吗?

到目前为止,我已经成功创建了这样的东西:

商店

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from '../reducers';

const store = createStore(rootReducer, applyMiddleware(thunk));

export default store;

操作

export const RUNNING_TIMER = 'RUNNING_TIMER';
export const GET_TASKS = 'GET_TASKS';
export const FETCH_FAILURE = 'FETCH_FAILURE';

export const runningTimer = (userId, query, statusTask, pageNumber) => dispatch => {
console.log(userId);
axios({
url: `/api/v1/beta/${userId}`,
method: 'GET'
})
.then(({ data }) => {
dispatch({
type: RUNNING_TIMER,
payload: data
});
})
.catch(error => {
console.log(error);

dispatch({ type: FETCH_FAILURE });
})
.then(() => {
const params = {
sort: 'name'
};

axios({
url: '/api/v1//tasks',
method: 'GET',
params
})
.then(({ data }) => {
dispatch({
type: GET_TASKS,
payload: data
});
})
.catch(error => {
console.log(error);
});
});
};

reducer

import { RUNNING_TIMER, GET_TASKS } from '../actions';

const isRunningTimer = (state = {}, action) => {
const { type, payload } = action;
switch (type) {
case RUNNING_TIMER:
return {
checkRunningTimer: payload,
checkRunningTimerId: payload && payload.id ? payload.id : null
};
break;
case GET_TASKS:
return {
tasks: payload,
lengthArrayTasks: parseInt(action.headers['x-pagination-total-count'])
};
default:
return state;
}
};

const rootReducer = combineReducers({ isRunningTimer });

export default rootReducer;

应用程序

class App extends Component {
constructor() {
super();
this.state = {
name: 'React'
};
}

componentDidMount() {
this.props.runningTimer();
}

render() {
return (
<div>

</div>
);
}
}

const mapStateToProps = state => {
const { isRunningTimer } = state;

return {
isRunningTimer
};
};

const mapDispatchToProps = dispatch => ({
runningTimer: (userId, query, statusTask, pageNumber) => dispatch(runningTimer()),
});

export default connect(
mapStateToProps,
mapDispatchToProps
)(App);

最佳答案

第一要考虑你的状态设计。

我发现考虑状态对象在给定时间点的样子很有用。

这是我的应用程序中使用的初始状态示例。

const initialState = {
grocers: null,
coords: {
latitude: 37.785,
longitude: -122.406
}

};

这是在 createStore 处注入(inject)的。

分解您的应用程序状态对象/属性,也应该帮助您简化操作。

数字 2

考虑分解你的行动。

我的想法,解耦操作代码,在 .then 在第二个 .then 。(考虑将结果保存在 user: 对象中的某个位置)

        .then(response => {
const data = response.data.user;
setUsers(data);})
.catch(error => {
console.log('There has been a problem with your fetch operation: ' + error.message);
})

function setUsers(data){
dispatch({
type: FETCH_USERS,
payload: data
});
}

这指的是SOLID设计原则中的S。单一职责原则。

https://devopedia.org/solid-design-principles

数字 3

如果“getUser”信息获取失败,请考虑这一点。

将进程/响应分开将使应用程序的调试更加干净。例如,用户api失败或者getTask api失败等。

<小时/>

有关 redux 的更多资源。 https://redux.js.org/introduction/learning-resources#thinking-in-redux

关于javascript - 将函数从纯 React 转换为 Redux React,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58234442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com