Tôi có một thành phần đơn giản gọi hành động khi người dùng tải trang và bên trong hành động đó, tôi đang cố gắng gửi một hành động khác để đặt trạng thái loggedIn
của lưu trữ là đúng hoặc sai:Redux Router - "Dispatch is not defined"
import React, { Component } from 'react'
import { Link, browserHistory } from 'react-router'
import $ from 'jquery'
class Login extends Component {
constructor(props) {
super(props)
}
componentDidMount() {
this.props.actions.guestLoginRequest()
}
render() {
return (
<div>
<div classNameName="container">
<div className="row">
We are signing you in as a guest
</div>
</div>
</div>
)
}
}
export default Login
tôi có thể nhận được thông tin đăng nhập khi hành động guestLoginRequest
được gọi, nhưng khi tôi cố gắng cử động khác bên trong của nó, không có gì xảy ra:
guestLoginRequest: function(){
var ref = new Firebase("https://penguinradio.firebaseio.com");
ref.authAnonymously(function(error, authData) {
if (error) {
console.log("Login Failed!", error);
} else {
console.log("Authenticated successfully with payload:", authData);
return dispatch => {
dispatch(actions.setLoginStatus(true, authData))
console.log("dispatched");
};
}
});
}
tôi nhận được lỗi của Uncaught ReferenceError: dispatch is not defined
khi tôi xóa return dispatch => { }
. Trong cửa hàng của tôi, tôi đang sử dụng Redux-thunk, vì vậy tôi có thể gửi bên trong của hành động:
// Store.js
import { applyMiddleware, compose, createStore } from 'redux'
import rootReducer from './reducers'
import logger from 'redux-logger'
import thunk from 'redux-thunk'
let finalCreateStore = compose(
applyMiddleware(thunk, logger())
)(createStore)
export default function configureStore(initialState = { loggedIn: false }) {
return finalCreateStore(rootReducer, initialState)
}
Tôi đang lập bản đồ công văn tới đạo cụ trong app.js của tôi cũng như:
function mapStateToProps(state) {
return state
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actions, dispatch)
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App)
Chỉ trong trường hợp có thể hữu ích, dưới đây là các tệp client.js và reducer của tôi:
// client.js
import React from 'react'
import { render } from 'react-dom'
import App from '../components/App'
import configureStore from '../redux/store'
import { Provider } from 'react-redux'
let initialState = {
loggedIn: false
}
let store = configureStore(initialState)
render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('app')
)
// Reducer.js
import { combineReducers } from 'redux'
let LoginStatusReducer = function reducer(loggedIn = false, action) {
switch (action.type) {
case 'UPDATE_LOGIN_STATUS':
return loggedIn = action.boolean
default:
return loggedIn
}
}
export default LoginStatusReducer
const rootReducer = combineReducers({
loggedIn: LoginStatusReducer
})
export default rootReducer
Bất kỳ ý tưởng nào về chức năng gửi của tôi không hoạt động? Tôi đang bối rối vì tôi đã thiết lập redux-thunk với cửa hàng của tôi, và tôi đang sử dụng mã tương tự như các tài liệu khi tôi gọi return dispatch => { }
. Có cái gì tôi đang mất tích? Cảm ơn bạn trước vì lời khuyên nào!
Tôi đã thay thế hành động của mình bằng hành động bạn đã đăng ở trên và cập nhật cuộc gọi công văn trên Login.js, nhưng tôi nhận được "công văn chưa được xác định" trên Tệp Login.js. Tôi có phải chuyển chức năng đó vào thành phần Đăng nhập không? Ngoài ra tôi nên gọi hàm trả về (dispatch) thay vì hàm trả về (dispatch * er *)? – Mike
Bạn sẽ cần hiển thị một trình bao bọc xung quanh 'dispatch' của cửa hàng (thông qua mapDispatchToProps) hoặc nhận bộ điều phối của cửa hàng trực tiếp (store.dispatch). Dưới đây là ví dụ triển khai: Thành phần - https://github.com/mattlo/consultant-app/blob/master/src/client/components/Chat/Chat.js#L66 Xuất cửa hàng - https: // github. com/mattlo/tư vấn-ứng dụng/blob/master/src/client/data/index.js # L11 –
Tôi đã cập nhật câu trả lời của mình để bao gồm hàm 'mapDispatchToProps' của tôi, có đúng không? – Mike