React와 Redux를 사용하여 사용자 로그인 시스템을 만들려고합니다. 다음과 같이 실물 모형 데이터를 사용합니다.사용자 배열에 사용자가 있는지 확인
const users = [
{
"id":1,
"username":"user1",
"email":"[email protected]",
"password":"1527393"
},
{
"id":2,
"username":"user2",
"email":"[email protected]",
"password":"1527393"
}
];
export default users;
이 데이터는 기본 상태로 저장소에 추가됩니다. 다음과 같이 내 store.js 파일은 다음과 같습니다 REDUX에 연결되어
import {createStore, compose} from 'redux';
import rootReducer from '../reducers/index';
import userLoginReducer from '../data/users';
const defaultState = {
userLoginReducer
};
export default function configureStore() {
return createStore(
rootReducer,
defaultState,
compose(
window.devToolsExtension ? window.devToolsExtension() : f => f //we use this line for chrome redux extension
)
);
}
내 로그인 구성 요소는 다음과 같습니다 페이지로드에
import React from 'react';
import LoginForm from './loginForm';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import * as actionCreators from '../../actions/actionCreators';
class Login extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
loginData: {
username: '',
password: ''
},
errors: {}
};
this.buttonClickHandle = this.buttonClickHandle.bind(this);
this.loginHandle = this.loginHandle.bind(this);
}
loginHandle(event) {
let field = event.target.name;
let value = event.target.value;
let loginData = this.state.loginData;
loginData[field] = value;
this.setState({loginData: loginData});
}
buttonClickHandle(event) {
event.preventDefault();
this.props.actions.userLoginSuccess(this.state.loginData.username, this.state.loginData.password);
if (this.props.users.length > 0) {
console.log("User exists. Go to the login page");
} else {
console.log("User doesn't exists. Show error message");
}
}
render() {
const language = this.props.currentLanguage;
return (
<div className="container">
<div className="row">
<p className="col-lg-4 col-xs-12 col-md-4 loginTitle noPadding">{language.loginTitle}</p>
<div className="col-lg-8 col-xs-12 col-md-8 loginForm noPadding">
<LoginForm currentLanguage={language} onClick={this.buttonClickHandle}
onChange={this.loginHandle} errors={this.state.errors}/>
</div>
</div>
</div>
);
}
}
function mapStateToProps(state, ownProps) {
return {
users: state.userLoginReducer
};
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actionCreators, dispatch)
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Login);
내가 데이터 파일에서 두 사용자를 얻을. 괜찮아.
로그인 구성 요소의 buttonClickHandle 함수에서 나는 사용자 이름과 암호로 작업을 호출하고 감속기에서 반환 된 배열이 비어 있는지 확인하려고합니다. 비어있는 경우 state.errors를 업데이트하고 비어 있지 않으면 환영 페이지로 리디렉션합니다.
감속기에서 데이터를 필터링하고 action.username이있는 사용자가 있는지 확인한 다음 해당 배열을 내 로그인 구성 요소로 반환합니다.
export default function userLoginReducer(state = [], action) {
switch(action.type){
case "USER_LOGIN_SUCCESS":
return [...state.filter(user => user.username === action.username)];
default:
return state;
}
}
을하지만이 작동하지 않습니다 다음과 같이
감속기 코드입니다.
페이지로드시 user1 사용자 이름으로 양식을 제출하면 작동하지만 페이지가 user18과 같이로드 될 때 제출할 때도 작동합니다.
어떤 조언이 필요합니까?
>하지만 작동하지 않습니다. 무슨 소리 야? 콘솔에 오류가 있습니까? –
그래야 제대로 작동하지 않습니다. 콘솔에 오류가 없습니다. 하지만 문제는 페이지가로드 될 때 사용자 이름이 user1 인 양식을 제출할 때 문제가 발생하지만 페이지를로드 할 때 제출할 때도 작동합니다. 예 : user18._ – Boky
내 대답을 보았습니까? –