- 補充:
在windows系統中查看,進入到需要查看的目錄后,按住shift鍵,然后單擊鼠標右鍵,選擇“在此處打開命令窗口”,輸入命令
目錄下的所有目錄:tree
目錄下的所有目錄和文件:tree /f
項目目錄樹
src
│ index.js
│ routes.js
│
├─actions
│ singupActions.js
│
├─components
│ │ App.js
│ │ NavigationBar.jsx
│ │
│ └─singup
│ SingupForm.jsx
│ SingupPage.jsx
│
└─reducers
auth.js
index.js
為了方便,我在public下的index.html中引入了bootstrap.css文件
public/indes.html
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.css" rel="stylesheet">
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import logger from 'redux-logger';
import thunk from 'redux-thunk'
import { composeWithDevTools } from 'redux-devtools-extension';
import { createStore, applyMiddleware } from 'redux';
import { Provider } from "react-redux";
import rootReducer from './reducers';
import routes from './routes'
import { BrowserRouter as Router } from 'react-router-dom'
import NavigationBar from './components/NavigationBar'
const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(logger, thunk)));
ReactDOM.render(
<Provider store={store}>
<Router routes={routes}>
<NavigationBar />
{routes}
</Router>
</Provider>,
document.getElementById('root')
);
routes.js
import React from 'react'
import { Route } from 'react-router-dom'
import App from './components/App'
import SingupPage from './components/singup/SingupPage'
export default (
<div className="container">
<Route exact path="/" component={App}></Route>
<Route path="/singup" component={SingupPage}></Route>
</div>
)
components/App.js
import React from 'react';
class App extends React.Component {
constructor() {
super()
}
render () {
return (
<div className="jumbotron">
<h1>Hi React Redux Login</h1>
</div>
);
}
}
export default App;
components/NavigationBar.jsx
import React from 'react';
import {Link} from 'react-router-dom';
class NavigationBar extends React.Component{
render(){
return(
<nav className="navbar navbar-expand-lg navbar-light bg-light mb-3">
<div className="container">
<Link className="navbar-brand" to="/">Login功能</Link>
<button className="navbar-toggler" type="button" data-toggler="collapse" data-target="">
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarsEcample05">
<ul className="navbar-nav mr-auto">
<li className="nav-item">
<Link className="nav-link" to="/singup">注冊</Link>
</li>
</ul>
</div>
</div>
</nav>
)
}
}
export default NavigationBar;
components/singup/SingupForm.js
import React from 'react'
export default class SingupForm extends React.Component{
constructor(props){
super(props);
this.state = {
username: '',
email: '',
password: '',
passwordConfirmation: ''
}
}
onChange = (e) => {
console.log(e.target.value);
this.setState({
[e.target.name]: e.target.value
});
console.log([e.target.name]);
}
onSubmit = (e) => {
e.preventDefault();
console.log(e);
console.log(this.state);
this.props.singupActions.userSingupRequest(this.state);
}
render(){
return (
<form onSubmit={this.onSubmit}>
<h1>Join our community</h1>
<div className="form-group">
<label className="control-label">Username</label>
<input type="text" name="username" value={this.state.username} onChange={this.onChange} className="form-control"/>
</div>
<div className="form-group">
<label className="control-label">Email</label>
<input type="email" name="email" value={this.state.email} onChange={this.onChange} className="form-control"/>
</div>
<div className="form-group">
<label className="control-label">password</label>
<input type="password" name="password" value={this.state.password} onChange={this.onChange} className="form-control"/>
</div>
<div className="form-group">
<label className="control-label">passwordConfirmation</label>
<input type="password" name="passwordConfirmation" value={this.state.passwordConfirmation} onChange={this.onChange} className="form-control"/>
</div>
<div className="form-group">
<button className="btn btn-primary btn-lg">注冊</button>
</div>
</form>
)
}
}
components/singup/SingupPage.js
import React from 'react'
import SingupForm from './SingupForm'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import * as singupActions from '../../actions/singupActions'
class SingupPage extends React.Component{
render(){
return(
<div className="row">
<div className="col-md-3"></div>
<div className="col-md-6">
<SingupForm singupActions={this.props.singupActions} />
</div>
<div className="col-md-3"></div>
</div>
)
}
}
const mapDispatchToProps = (dispatch) => {
return{
singupActions: bindActionCreators(singupActions,dispatch)
}
}
export default connect(null,mapDispatchToProps)(SingupPage);
components/reducers/auth.js
const auth = (state = {}, action) => {
switch (action.type) {
default:
return state;
}
}
export default auth;
components/reducers/index.js
import { combineReducers } from "redux";
import auth from "./auth";
const rootReducer = combineReducers({
auth
})
export default rootReducer;
actions/singupActions.js
import axios from 'axios'
export const userSingupRequest = (userData) => {
// thunk
return dispatch => {
return axios.past('/api/user', userData);
}
}
持續更新中.......