评论组件案例
组件通讯-非父子
组件通讯-父到子
组件通讯-评论案例
组件通讯-子到父
1、router-demo
react-router基础组件介绍
1.1、components
(1)Home.jsx
import React from 'react'
export default class Home extends React.Component {
render() {
return <div>这是Home组件</div>
}
}
(2)Login.jsx
import React from 'react'
export default class Login extends React.Component {
render() {
return <div>这是Login组件</div>
}
}
(3)User.jsx
import React from 'react'
export default class User extends React.Component {
render() {
return <div>这是User组件</div>
}
}
1.2、App.css
.now {
font-size: 24px;
color: red;
}
1.3、App.jsx
import React from 'react'
import './App.css'
import Home from './components/Home'
import Login from './components/Login'
import User from './components/User'
// react-router-dom这个包,给我们声明了很多的组件
// 我们可以直接导入这些组件去使用,就可以完成我们想要的路由相关的功能
// 1. 路由容器相关的组件: HashRouter: 有#号,锚点实现 BrowserRouter:没有#号,<h5></h5>
// 2. 路由连接 Link NavLink
// Link: to属性,表示的点击这个Link,跳转到的路由, Link最终渲染成a标签
// NavLink: 作用和Link是一样的,路由跳转 NavLink比Link更强大的一点是可以指定样式
// 3. 路由匹配 Route: 一条路由规则 Switch: 保证同时只会匹配一条路由规则
// Route表示一条路由规则,同时也表示路由的出口(匹配的组件在哪儿显示)
// Switch组件,可以保证只会匹配到一个路由, Swicth中只能出现Route
import {
BrowserRouter,
NavLink,
Route,
Switch,
Redirect
} from 'react-router-dom'
class App extends React.Component {
render() {
return (
<BrowserRouter>
<div>
<div>我是一个根组件</div>
<ul>
<li>
<NavLink activeClassName="now" to="/home">
首页
</NavLink>
</li>
<li>
<NavLink activeClassName="now" to="/users">
用户管理
</NavLink>
</li>
<li>
<NavLink activeClassName="now" to="/login">
登录
</NavLink>
</li>
</ul>
<Switch>
{/* path="/" 只要是/xxx的路由都匹配上exact表示精确匹配 */}
{/* Redirect: 表示路由的重定向 */}
<Redirect exact from="/" to="/home" />
<Route path="/home" component={Home} />
<Route path="/users" component={User} />
<Route path="/login" component={Login} />
</Switch>
</div>
</BrowserRouter>
)
}
}
export default App
1.4、index.js
import React from 'react'
import ReactDOM from 'react-dom'
// 如果App根组件
import App from './App'
// 渲染根组件到页面
ReactDOM.render(<App />, document.getElementById('root'))
2、react-router获取路由参数
2.1、components
(1)News.jsx
import React from 'react'
export default class News extends React.Component {
// 通过props.match就可以获取到路由的参数
render() {
let { match } = this.props
console.log(match)
// 获取到路由的参数 /news/1 /news/2
return <div>这是News组件</div>
}
}
2.2、App.css
.now {
font-size: 24px;
color: red;
}
2.3、App.jsx
import React from 'react'
import './App.css'
import News from './components/News'
// react-router-dom这个包,给我们声明了很多的组件
// 我们可以直接导入这些组件去使用,就可以完成我们想要的路由相关的功能
// 1. 路由容器相关的组件: HashRouter: 有#号,锚点实现 BrowserRouter:没有#号,<h5></h5>
// 2. 路由连接 Link NavLink
// Link: to属性,表示的点击这个Link,跳转到的路由, Link最终渲染成a标签
// NavLink: 作用和Link是一样的,路由跳转 NavLink比Link更强大的一点是可以指定样式
// 3. 路由匹配 Route: 一条路由规则 Switch: 保证同时只会匹配一条路由规则
// Route表示一条路由规则,同时也表示路由的出口(匹配的组件在哪儿显示)
// Switch组件,可以保证只会匹配到一个路由, Swicth中只能出现Route
import { HashRouter, Link, Switch, Route } from 'react-router-dom'
class App extends React.Component {
render() {
return (
<HashRouter>
<div>
<div>我是一个根组件</div>
<ul>
<li>
<Link to="/news/1">新闻1</Link>
</li>
<li>
<Link to="/news/2">新闻2</Link>
</li>
<li>
<Link to="/news/3">新闻3</Link>
</li>
</ul>
<Switch>
{/*
路由参数: /news/:id 表示匹配 /news/xx /news/a /news/b
*/}
{/* <Route path="/news/:aa" component={News} /> */}
{/* /news/xxx/xxx */}
{/* http://localhost:3000/#/news/hello/3 */}
<Route path="/news/:type/:id" component={News} />
</Switch>
</div>
</HashRouter>
)
}
}
export default App
2.4、index.js
import React from 'react'
import ReactDOM from 'react-dom'
// 如果App根组件
import App from './App'
// 渲染根组件到页面
ReactDOM.render(<App />, document.getElementById('root'))
3、react-router编程式导航
3.1、components
(1)Home.jsx
import React from 'react'
export default class Home extends React.Component {
render() {
return <div>这是Home组件</div>
}
}
(2)Login.jsx
import React from 'react'
// 如果想要通过js来实现react中路由的跳转
// 1. 导入withRouter方法
// 2. 使用withRouter包裹住当前组件
// 3. withRouter把当前组件包裹后,在当前组件的props中就能够获取history对象
// ,通过history对象就可以实现路由的额跳转
import { withRouter } from 'react-router-dom'
class Login extends React.Component {
render() {
console.log(this.props.history)
// history对象
let { history } = this.props
return (
<div>
{/* 需求:点击登录的时候,跳转到首页组件去 */}
{/* 编程式导航:通过js来显现路由的跳转 */}
这是Login组件{' '}
<button onClick={() => history.push('/home')}>点击登录</button>
</div>
)
}
}
export default withRouter(Login)
(3)User.jsx
import React from 'react'
export default class User extends React.Component {
render() {
return <div>这是User组件</div>
}
}
3.2、App.css
.now {
font-size: 24px;
color: red;
}
3.3、App.jsx
import React from 'react'
import './App.css'
import Home from './components/Home'
import Login from './components/Login'
import User from './components/User'
// 声明式导航: 通过Link或者NavLink实现导航的跳转
// 编程式导航: 通过js代码来实现路由的跳转 router.push()
import { BrowserRouter, Link, Route, Switch, Redirect } from 'react-router-dom'
class App extends React.Component {
render() {
return (
<BrowserRouter>
<div>
{/* <ul>
<li>
<Link to="/home" component={Home}>
首页
</Link>
</li>
<li>
<Link to="/user" component={User}>
用户
</Link>
</li>
<li>
<Link to="/Login" component={Login}>
登录
</Link>
</li>
</ul> */}
{/* Redirect: 表示路由的重定向 */}
<Switch>
<Redirect exact from="/" to="/home" />
<Route path="/home" component={Home} />
<Route path="/user" component={User} />
<Route path="/login" component={Login} />
</Switch>
</div>
</BrowserRouter>
)
}
}
export default App
3.4、index.js
import React from 'react'
import ReactDOM from 'react-dom'
// 如果App根组件
import App from './App'
// 渲染根组件到页面
ReactDOM.render(<App />, document.getElementById('root'))
4、好客租房移动web项目(1)
4.1、components
(1)Home.jsx
import React from 'react'
import { Link, Switch, Route } from 'react-router-dom'
export default class Home extends React.Component {
render() {
return (
<div>
<ul>
<li>
<Link to="/home/roles">角色列表</Link>
</li>
<li>
<Link to="/home/list">列表管理</Link>
</li>
<li>
<Link to="/home/product">商品管理</Link>
</li>
</ul>
<Switch>
<Route path="/home/roles" component={Role} />
<Route path="/home/list" component={List} />
<Route path="/home/product" component={Product} />
</Switch>
</div>
)
}
}
function Role() {
return <div>这是Role组件</div>
}
function List() {
return <div>这是List组件</div>
}
function Product() {
return <div>这是Product组件</div>
}
(2)Login.jsx
import React from 'react'
// 如果想要通过js来实现react中路由的跳转
// 1. 导入withRouter方法
// 2. 使用withRouter包裹住当前组件
// 3. withRouter把当前组件包裹后,在当前组件的props中就能够获取history对象
// ,通过history对象就可以实现路由的额跳转
import { withRouter } from 'react-router-dom'
class Login extends React.Component {
render() {
console.log(this.props.history)
// history对象
let { history } = this.props
return (
<div>
{/* 需求:点击登录的时候,跳转到首页组件去 */}
{/* 编程式导航:通过js来显现路由的跳转 */}
这是Login组件{' '}
<button onClick={() => history.push('/home')}>点击登录</button>
</div>
)
}
}
export default withRouter(Login)
(3)User.jsx
import React from 'react'
export default class User extends React.Component {
render() {
// 可以在任意的组件中继续配置路由
return <div>这是User组件</div>
}
}
4.2、App.css
.now {
font-size: 24px;
color: red;
}
4.3、App.jsx
import React from 'react'
import './App.css'
import Home from './components/Home'
import Login from './components/Login'
import User from './components/User'
// 声明式导航: 通过Link或者NavLink实现导航的跳转
// 编程式导航: 通过js代码来实现路由的跳转 router.push()
import { BrowserRouter, Link, Route, Switch, Redirect } from 'react-router-dom'
class App extends React.Component {
render() {
return (
<BrowserRouter>
<div>
<Switch>
<Redirect exact from="/" to="/home" />
<Route path="/home" component={Home} />
<Route path="/user" component={User} />
<Route path="/login" component={Login} />
</Switch>
</div>
</BrowserRouter>
)
}
}
export default App
4.4、index.js
import React from 'react'
import ReactDOM from 'react-dom'
// 如果App根组件
import App from './App'
// 渲染根组件到页面
ReactDOM.render(<App />, document.getElementById('root'))
5、好客租房移动web项目(2)
5.1、components
(1)Home.jsx
import React from 'react'
class Home extends React.Component {
// 点标记语法
render() {
return <div>这是Home组件</div>
}
}
export default Home
(2)Login.css
.login_container {
height: 100%;
background-color: #90ee90;
}
.login_title {
height: 50px;
line-height: 50px;
background-color: #21b97a;
text-align: center;
color: #fff;
font-size: 24px;
}
.login_form {
margin: 20px 10px;
}
(3)Login.jsx
import React from 'react'
// 引入semanticui的组件
import { Form } from 'semantic-ui-react'
// 引入Login.css样式
import './Login.css'
class Login extends React.Component {
render() {
return (
<div className="login_container">
<div className="login_title">登录</div>
<div className="login_form">
{/* Form:表示整个表单组件 */}
{/* Form.Field:表示表单的一个字段 */}
<Form action="">
<Form.Field>
<Form.Input
size="big"
icon="user"
iconPosition="left"
placeholder="请输入用户名..."
name="username"
autoComplete="off"
/>
</Form.Field>
<Form.Field>
<Form.Input
size="big"
icon="lock"
iconPosition="left"
placeholder="请输入密码..."
name="password"
autoComplete="off"
/>
</Form.Field>
<Form.Field>
<Form.Button fluid positive size="big">
登录
</Form.Button>
</Form.Field>
</Form>
</div>
</div>
)
}
}
export default Login
(4)点标记语法的介绍.jsx
import React from 'react'
class Home extends React.Component {
// 点标记语法
render() {
return (
<Form>
<Form.Input />
<Form.Button />
</Form>
)
}
}
class Form extends React.Component {
render() {
return (
<div>
我是一个form组件
{this.props.children}
</div>
)
}
// 可以在组件内部去定义组件
static Input = () => {
return <div>Input组件</div>
}
static Button = () => {
return <div>Button组件</div>
}
}
export default Home
5.2、App.jsx
import React from 'react'
// 导入路由
import {
BrowserRouter as Router,
Route,
Switch,
Redirect
} from 'react-router-dom'
// 导入组件
import Home from './components/Home'
import Login from './components/Login'
class App extends React.Component {
render() {
return (
<Router>
<Switch>
<Redirect exact path="/" to="/login" />
<Route path="/login" component={Login} />
<Route path="/home" component={Home} />
</Switch>
</Router>
)
}
}
export default App
5.3、index.css
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
#root {
height: 100%;
width: 100%;
}
5.4、index.js
import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import 'semantic-ui-css/semantic.min.css'
import App from './App'
ReactDOM.render(<App />, document.getElementById('root'))