本人的React学习笔记分类(也是对应本人技术成长过程):[想快速入门看这部分]、[想对React系统全面进行学习的同学看这里]、[对基础学习完成且有了一定开发经验,想尝试解析源码的看这里]

一、React插槽

组建中写入内容,这些内容可以被识别和控制。React需要自己开发支持插槽功能。

原理:组件中写入的HTML,可以传入到props中。

1、组件中的HTML内容直接全部插入
  1. class ParentCom extends React.Component{
  2. render(){
  3. console.log(this.props)
  4. return (
  5. <div>
  6. <h1>组件插槽</h1>
  7. {this.props.children}
  8. </div>
  9. )
  10. }
  11. }

2、组件中根据HTML内容的不同,插入的位置不同。
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. class ParentCom extends React.Component{
  4. render(){
  5. console.log(this.props)
  6. return (
  7. <div>
  8. <h1>组件插槽</h1>
  9. {this.props.children}
  10. <ChildCom>
  11. <h1 data-position="header">这是放置到头部的内容</h1>
  12. <h1 data-position="main">这是放置到主要的内容</h1>
  13. <h1 data-position="footer">这是放置到尾部的内容</h1>
  14. </ChildCom>
  15. </div>
  16. )
  17. }
  18. }
  19. class ChildCom extends React.Component{
  20. render(){
  21. let headerCom,mainCom,footerCom;
  22. this.props.children.forEach((item,index)=>{
  23. if(item.props['data-position']==='header'){
  24. headerCom = item
  25. }else if(item.props['data-position']==='main'){
  26. mainCom = item
  27. }else{
  28. footerCom = item
  29. }
  30. })
  31. return (
  32. <div>
  33. <div className="header">
  34. {headerCom}
  35. </div>
  36. <div className="main">
  37. {mainCom}
  38. </div>
  39. <div className="footer">
  40. {footerCom}
  41. </div>
  42. </div>
  43. )
  44. }
  45. }
  46. class RootCom extends React.Component{
  47. constructor(props){
  48. super(props)
  49. //console.log(props)
  50. this.state = {
  51. arr:[1,2,3]
  52. }
  53. }
  54. render(){
  55. return (
  56. <ParentCom>
  57. <h2 data-name="a" data-index={this.state.arr[0]}>子组件1</h2>
  58. <h2 data-name="b" data-index={this.state.arr[1]}>子组件2</h2>
  59. <h2 data-name="c" data-index={this.state.arr[2]}>子组件3</h2>
  60. </ParentCom>
  61. )
  62. }
  63. }
  64. ReactDOM.render(
  65. <RootCom></RootCom>
  66. ,
  67. document.querySelector("#root")
  68. )

二、React路由

根据不同的路径,显示不同的组件(内容);React使用的库react-router-dom;

1、安装

  1. Cnpm install react-router-dom --save

2、ReactRouter三大组件:

  1. Router:所有路由组件的根组件(底层组件),包裹路由规则的最外层容器。
    属性:basename->设置跟此路由根路径,router可以在1个组件中写多个。

  2. Route:路由规则匹配组件,显示当前规则对应的组件

  3. Link:路由跳转的组件

    1. Link的replace属性:点击链接后,将新地址替换成历史访问记录的原地址。

注意:如果要精确匹配,那么可以在route上设置exact属性。

1、使用案例

  1. import React from 'react';
  2. //hash模式
  3. //import {HashRouter as Router,Link,Route} from 'react-router-dom'
  4. //history模式/后端匹配使用
  5. import {BrowserRouter as Router,Link,Route} from 'react-router-dom'
  6. function Home(){
  7. return (
  8. <div>
  9. <h1>admini首页</h1>
  10. </div>
  11. )
  12. }
  13. function Me(){
  14. return (
  15. <div>
  16. <h1>admin个人中心</h1>
  17. </div>
  18. )
  19. }
  20. function Product(){
  21. return (
  22. <div>
  23. <h1>admin产品页面</h1>
  24. </div>
  25. )
  26. }
  27. class App extends React.Component{
  28. render(){
  29. return (
  30. <div id="app">
  31. {/* <div>所有页面普通内容</div> */}
  32. <Router>
  33. <Route path="/" exact component={()=>(<div>首页</div>)}></Route>
  34. <Route path="/me" component={()=>(<div>me</div>)}></Route>
  35. <Route path="/product" component={()=>(<div>product</div>)}></Route>
  36. </Router>
  37. <Router>
  38. {/* <div className="nav">
  39. <Link to="/">Home</Link>
  40. <Link to="/product">Product</Link>
  41. <Link to="/me">个人中心</Link>
  42. </div> */}
  43. <Route path="/admin/" exact component={Home}></Route>
  44. <Route path="/admin/product" component={Product}></Route>
  45. <Route path="/admin/me" exact component={Me}></Route>
  46. </Router>
  47. </div>
  48. )
  49. }
  50. }
  51. export default App

Link组件可以设置to属性来进行页面的跳转,to属性可以直接写路径的字符串,也可以通过1个对象,进行路径的设置,如

  1. render(){
  2. let meObj = {
  3. pathname:"/me",//跳转的路径
  4. search:"?username=admin",//get请求参数
  5. hash:"#abc",//设置的HASH值
  6. state:{msg:'helloworld'}//传入组件的数据
  7. };
  8. return (
  9. <div id="app">
  10. <Router>
  11. <div className="nav">
  12. <Link to="/">Home</Link>
  13. <Link to="/product">Product</Link>
  14. <Link to={ meObj }>个人中心</Link>
  15. </div>
  16. <Route path="/" exact component={Home}></Route>
  17. <Route path="/product" component={Product}></Route>
  18. <Route path="/me" exact component={Me}></Route>
  19. </Router>
  20. </div>
  21. )
  22. }

Link的replace属性:点击链接后,将新地址替换成历史访问记录的原地址。

2、动态路由实现

  1. import React from 'react';
  2. //hash模式
  3. //import {HashRouter as Router,Link,Route} from 'react-router-dom'
  4. //history模式/后端匹配使用
  5. import {BrowserRouter as Router,Link,Route} from 'react-router-dom'
  6. function Home(){
  7. return (
  8. <div>
  9. <h1>admini首页</h1>
  10. </div>
  11. )
  12. }
  13. function Me(props){
  14. console.log(props)
  15. return (
  16. <div>
  17. <h1>admin个人中心</h1>
  18. </div>
  19. )
  20. }
  21. function Product(){
  22. return (
  23. <div>
  24. <h1>admin产品页面</h1>
  25. </div>
  26. )
  27. }
  28. function News(props){
  29. console.log(props)
  30. return (
  31. <div>
  32. 新闻页,新闻id:{props.match.params.id}
  33. </div>
  34. )
  35. }
  36. class App extends React.Component{
  37. render(){
  38. let meObj = {
  39. pathname:"/me",//跳转的路径
  40. search:"?username=admin",//get请求参数
  41. hash:"#abc",//设置的HASH值
  42. state:{msg:'helloworld'}//传入组件的数据
  43. };
  44. return (
  45. <div id="app">
  46. <Router>
  47. <div className="nav">
  48. <Link to="/">Home</Link>
  49. <Link to="/product">Product</Link>
  50. <Link to={ meObj } replace>个人中心</Link>
  51. <Link to="/news/4568789">新闻页</Link>
  52. </div>
  53. <Route path="/" exact component={Home}></Route>
  54. <Route path="/product" component={Product}></Route>
  55. <Route path="/me" exact component={Me}></Route>
  56. <Route path="/news/:id" component={News}></Route>
  57. </Router>
  58. </div>
  59. )
  60. }
  61. }
  62. export default App

3、重定向组件—Redirect

如果访问某个组件时,如果有重定向组件,那么就会修改页面路径,使得页面内容显示为所定向路径的内容

  1. function LoginInfo(props){
  2. //props.loginState = 'success';
  3. //props.loginState = "fail"
  4. console.log(props)
  5. if(props.location.state.loginState === 'success'){
  6. return <Redirect to="/admin"></Redirect>
  7. }else{
  8. return <Redirect to="/login"></Redirect>
  9. }
  10. }

4、Switch组件

让switch组件内容的route只匹配1个,只要匹配到了,剩余的路由规则将不再匹配

  1. class App extends React.Component{
  2. render(){
  3. return (
  4. <div>
  5. <Router>
  6. <Switch>
  7. <Route path="/" exact component={()=>(<h1>首页</h1>)}></Route>
  8. <Route path="/form" exact component={FormCom}></Route>
  9. <Route path="/login" exact component={()=>(<h1>登录页</h1>)}></Route>
  10. <Route path="/logininfo" exact component={LoginInfo}></Route>
  11. <Route path="/admin" exact component={()=>(<h1>admin页,登录成功</h1>)}></Route>
  12. <Route path="/abc" exact component={()=>(<h1>abc1页,登录成功</h1>)}></Route>
  13. <Route path="/abc" exact component={()=>(<h1>abc2页,登录成功</h1>)}></Route>
  14. </Switch>
  15. </Router>
  16. </div>
  17. )
  18. }
  19. }