Có rất nhiều cuộc nói chuyện về đứa trẻ mới nhất trong thị trấn redux ngay bây giờ, redux-saga / redux-saga . Nó sử dụng các chức năng của trình tạo để nghe / gửi các hành động.
Trước khi tôi xoay quanh nó, tôi muốn biết những ưu / nhược điểm của việc sử dụng redux-saga
thay vì cách tiếp cận bên dưới nơi tôi đang sử dụng redux-thunk
với async / await.
Một thành phần có thể trông như thế này, gửi các hành động như bình thường.
import { login } from 'redux/auth';
class LoginForm extends Component {
onClick(e) {
e.preventDefault();
const { user, pass } = this.refs;
this.props.dispatch(login(user.value, pass.value));
}
render() {
return (<div>
<input type="text" ref="user" />
<input type="password" ref="pass" />
<button onClick={::this.onClick}>Sign In</button>
</div>);
}
}
export default connect((state) => ({}))(LoginForm);
Sau đó, hành động của tôi trông giống như thế này:
// auth.js
import request from 'axios';
import { loadUserData } from './user';
// define constants
// define initial state
// export default reducer
export const login = (user, pass) => async (dispatch) => {
try {
dispatch({ type: LOGIN_REQUEST });
let { data } = await request.post('/login', { user, pass });
await dispatch(loadUserData(data.uid));
dispatch({ type: LOGIN_SUCCESS, data });
} catch(error) {
dispatch({ type: LOGIN_ERROR, error });
}
}
// more actions...
// user.js
import request from 'axios';
// define constants
// define initial state
// export default reducer
export const loadUserData = (uid) => async (dispatch) => {
try {
dispatch({ type: USERDATA_REQUEST });
let { data } = await request.get(`/users/${uid}`);
dispatch({ type: USERDATA_SUCCESS, data });
} catch(error) {
dispatch({ type: USERDATA_ERROR, error });
}
}
// more actions...
::
trước khi bạn this.onClick
làm?
this
), aka this.onClick = this.onClick.bind(this)
. Dạng dài hơn thường được khuyến nghị thực hiện trong hàm tạo, vì tay ngắn liên kết lại trên mỗi kết xuất.
bind()
rất nhiều để chuyển this
đến chức năng, nhưng tôi đã bắt đầu sử dụng () => method()
ngay bây giờ.