I am making a React frontend api which uses three component under switch. Nothing under the switch section is rendered. Here is my app.js
import React from "react";
import Nav from "react-bootstrap/Nav";
import Navbar from "react-bootstrap/Navbar";
import Container from "react-bootstrap/Container";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import "bootstrap/dist/css/bootstrap.css";
import "./App.css";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import EditExpense from "./components/edit-expense.component";
import ExpensesList from "./components/expenses-listing.component";
import CreateExpense from "./components/create-expense.component";
function App() {
return (<Router>
<div className="App">
<header className="App-header">
<Navbar bg="success" variant="success">
<Container>
<Navbar.Brand>
<Link to={"/create-expense"} className="nav-link">
Expense manager
</Link>
</Navbar.Brand>
<Nav className="justify-content-end">
<Nav>
<Link to={"/create-expense"} className="nav-link">
Create Expense
</Link>
<Link to={"/expenses-listing"} className="nav-link">
Expenses List
</Link>
</Nav>
</Nav>
</Container>
</Navbar>
</header>
<Container>
<Row>
<Col md={12}>
<div className="wrapper">
<Switch>
<Route exact path='/' component={CreateExpense} />
<Route path="/create-expense" component={CreateExpense} />
<Route path="/edit-expense/:id" component={EditExpense} />
<Route path="/expenses-listing" component={ExpensesList} />
</Switch>
</div>
</Col>
</Row>
</Container>
</div>
</Router>);
}
export default App;
here is create-expense.component.js
import React, { Component } from "react";
import Form from 'react-bootstrap/Form'
import Button from 'react-bootstrap/Button'
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import axios from 'axios'
import ExpensesList from './expenses-listing.component';
import Swal from 'sweetalert2';
export default class CreateExpense extends Component {
constructor(props) {
super(props)
// Setting up functions
this.onChangeExpenseName = this.onChangeExpenseName.bind(this);
this.onChangeExpenseAmount = this.onChangeExpenseAmount.bind(this);
this.onChangeExpenseDescription = this.onChangeExpenseDescription.bind(this);
this.onSubmit = this.onSubmit.bind(this);
// Setting up state
this.state = {
name: '',
description: '',
amount: ''
}
}
onChangeExpenseName(e) {
this.setState({name: e.target.value})
}
onChangeExpenseAmount(e) {
this.setState({amount: e.target.value})
}
onChangeExpenseDescription(e) {
this.setState({description: e.target.value})
}
onSubmit(e) {
e.preventDefault()
const expense = {
name: this.state.name,
amount: this.state.amount,
description: this.state.description
};
axios.post('http://localhost:8000/api/expenses/', expense)
.then(res => console.log(res.data));
// console.log(`Expense successfully created!`);
// console.log(`Name: ${this.state.name}`);
// console.log(`Amount: ${this.state.amount}`);
// console.log(`Description: ${this.state.description}`);
Swal.fire(
'Good job!',
'Expense Added Successfully',
'success'
)
this.setState({name: '', amount: '', description: ''})
}
render() {
return (<div className="form-wrapper">
<Form onSubmit={this.onSubmit}>
<Row>
<Col>
<Form.Group controlId="Name">
<Form.Label>Name</Form.Label>
<Form.Control type="text" value={this.state.name} onChange={this.onChangeExpenseName}/>
</Form.Group>
</Col>
<Col>
<Form.Group controlId="Amount">
<Form.Label>Amount</Form.Label>
<Form.Control type="number" value={this.state.amount} onChange={this.onChangeExpenseAmount}/>
</Form.Group>
</Col>
</Row>
<Form.Group controlId="description">
<Form.Label>Description</Form.Label>
<Form.Control as="textarea" type="textarea" value={this.state.description} onChange={this.onChangeExpenseDescription}/>
</Form.Group>
<Button variant="primary" size="lg" block="block" type="submit">
Add Expense
</Button>
</Form>
<br></br>
<br></br>
<ExpensesList> </ExpensesList>
</div>);
}
}
here is another component js file edit-expense.component.js
import React, { Component } from "react";
import Form from 'react-bootstrap/Form'
import Button from 'react-bootstrap/Button';
import axios from 'axios';
export default class EditExpense extends Component {
constructor(props) {
super(props)
this.onChangeExpenseName = this.onChangeExpenseName.bind(this);
this.onChangeExpenseAmount = this.onChangeExpenseAmount.bind(this);
this.onChangeExpenseDescription = this.onChangeExpenseDescription.bind(this);
this.onSubmit = this.onSubmit.bind(this);
// State
this.state = {
name: '',
amount: '',
description: ''
}
}
componentDidMount() {
axios.get('http://localhost:8000/api/expenses/' + this.props.match.params.id)
.then(res => {
this.setState({
name: res.data.name,
amount: res.data.amount,
description: res.data.description
});
})
.catch((error) => {
console.log(error);
})
}
onChangeExpenseName(e) {
this.setState({ name: e.target.value })
}
onChangeExpenseAmount(e) {
this.setState({ amount: e.target.value })
}
onChangeExpenseDescription(e) {
this.setState({ description: e.target.value })
}
onSubmit(e) {
e.preventDefault()
const expenseObject = {
name: this.state.name,
amount: this.state.amount,
description: this.state.description
};
axios.put('http://localhost:8000/api/expenses/' + this.props.match.params.id, expenseObject)
.then((res) => {
console.log(res.data)
console.log('Expense successfully updated')
}).catch((error) => {
console.log(error)
})
// Redirect to Expense List
this.props.history.push('/expenses-listing')
}
render() {
return (<div className="form-wrapper">
<Form onSubmit={this.onSubmit}>
<Form.Group controlId="Name">
<Form.Label>Name</Form.Label>
<Form.Control type="text" value={this.state.name} onChange={this.onChangeExpenseName} />
</Form.Group>
<Form.Group controlId="Amount">
<Form.Label>Amount</Form.Label>
<Form.Control type="number" value={this.state.amount} onChange={this.onChangeExpenseAmount} />
</Form.Group>
<Form.Group controlId="Description">
<Form.Label>Description</Form.Label>
<Form.Control type="text" value={this.state.description} onChange={this.onChangeExpenseDescription} />
</Form.Group>
<Button variant="danger" size="lg" block="block" type="submit">
Update Expense
</Button>
</Form>
</div>);
}
}
I am new to React and not sure why nothing under the is working? Is there some routing issue or is there a error in the components?
question from:
https://stackoverflow.com/questions/65646977/switch-section-in-app-js-file-of-react-not-displayed 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…