React(7)(1),2024年京东前端岗面试必问

  1. Switch可以提高路由匹配效率(单一匹配)。

这样只要匹配到了第一个就不会再往下匹配了

8. 解决多级路径刷新页面样式丢失的问题


  1. public/index.html 中 引入样式时不写.// (常用)【绝对路径】

  2. public/index.html 中 引入样式时不写./%PUBLIC_URL% (常用)

  3. 使用HashRouter

9. 路由的严格匹配与模糊匹配


  1. 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)

  2. 开启严格匹配:<Route exact={true} path="/about" component={About}/>

  3. 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由

10. Redirect的使用 【重定向】


一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由

具体编码:

四、嵌套路由使用

===========================================================================

1. 最终效果


在这里插入图片描述

2. 注意


  1. 注册子路由时要写上父路由的path值

  2. 路由的匹配是按照注册路由的顺序进行的

3. 实现


Home/index.jsx

import React, { Component } from ‘react’

import { Route, NavLink,Redirect,Switch } from ‘react-router-dom’

import News from ‘./News’

import Message from ‘./Message’

export default class Home extends Component {

render() {

return (

我是Home的内容

    • News

    • Message

      )

      }

      }

      五、向路由组件传递参数数据

      ================================================================================

      1. 效果


      在这里插入图片描述

      2. 具体方法


      方法1. params参数

      1. 路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>

      2. 注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>

      3. 接收参数:this.props.match.params

      Message/index.jsx

      import React, { Component } from ‘react’

      import { Link, Route } from ‘react-router-dom’;

      import Detail from ‘./Detail’;

      export default class Message extends Component {

      state = {

      messageArr: [

      { id: ‘01’, title: ‘消息1’ },

      { id: ‘02’, title: ‘消息2’ },

      { id: ‘03’, title: ‘消息3’ },

      ]

      }

      render() {

      const { messageArr } = this.state;

      return (

        {

        messageArr.map((msgObj) => {

        return (

      • {/* 向路由组件传递params参数 */}

        {msgObj.title}

        )

        })

        }


        {/* 声明接收params参数 */}

        )

        }

        }

        Detail/index.jsx

        import React, { Component } from ‘react’

        export default class Detail extends Component {

        state = {

        detailData : [

        { id: ‘01’, content: ‘你好啊’ },

        { id: ‘02’, content: ‘还不错鸭’ },

        { id: ‘03’, content: ‘显示我吧’ }

        ]

        }

        render() {

        console.log(this.props)

        // 接收params参数

        const { id, title } = this.props.match.params

        const findResult= this.state.detailData.find((dataObj) => {

        return dataObj.id === id

        })

        return (

        • ID: {id }
        • Title: {title }
        • Content: { findResult.content}
        • )

          }

          }

          在这里插入图片描述

          方法2. search参数

          1. 路由链接(携带参数):<Link to='/demo/test?name=tom&age=18'}>详情</Link>

          2. 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>

          3. 接收参数:this.props.location.search

          4. 备注:获取到的searchurlencoded编码字符串,需要借助querystring解析

          import qs from ‘querystring’

          let obj = {name:‘tom’, age:18}

          console.log(qs.stringify(obj)) // name=tom&age=18

          let str = ‘carName=Benz&price=199’

          console.log(qs.parse(str)) // {carName: ‘Benz’, price: 199}

          方法3. state参数

          1. 路由链接(携带参数):<Link to={{ pathname:'/demo/test', state:{name:'tom',age:18} }}>详情</Link>

          2. 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>

          3. 接收参数:this.props.location.state

          4. 备注:刷新也可以保留住参数【history对象记录着在】

          Message/index.jsx

          export default class Message extends Component {

          render() {

          const {messageArr} = this.state

          return (

            {

            messageArr.map((msgObj)=>{

            return (

          • {/* 向路由组件传递params参数 */}

            {/* <Link to={/home/message/detail/${msgObj.id}/${msgObj.title}}>{msgObj.title} */}

            {/* 向路由组件传递search参数 */}

            {/* <Link to={/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}}>{msgObj.title} */}

            {/* 向路由组件传递state参数 */}

            {msgObj.title}

            )

            })

            }


            {/* 声明接收params参数 */}

            {/* */}

            {/* search参数无需声明接收,正常注册路由即可 */}

            {/* */}

            {/* state参数无需声明接收,正常注册路由即可 */}

            )

            }

            }

            Detail/index.jsx

            import React, { Component } from ‘react’

            // import qs from ‘querystring’

            export default class Detail extends Component {

            render() {

            console.log(this.props);

            // 接收params参数

            // const {id,title} = this.props.match.params

            // 接收search参数

            // const {search} = this.props.location

            // const {id,title} = qs.parse(search.slice(1))

            // 接收state参数

            const {id,title} = this.props.location.state || {}

            const findResult = DetailData.find((detailObj)=>{

            return detailObj.id === id

            }) || {}

            return (

            • ID:{id}
            • TITLE:{title}
            • CONTENT:{findResult.content}
            • )

              }

              }

              六、多种路由跳转方式

              =============================================================================

              1. 编程式路由导航


              借助this.prosp.history对象上的API对操作路由跳转、前进、后退

              • this.prosp.history.push(path, [state]) 将新条目推入历史记录堆栈

              • this.prosp.history.replace(path, [state]) 替换历史记录堆栈上的当前条目

              • this.prosp.history.go() 将历史堆栈中的指针移动n个条目

              • this.prosp.history.goBack() 等同于 go(-1)

              • this.prosp.history.goForward() 等同于 go(1)

              2. withRouter的使用


              自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

              深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

              因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
              img
              img
              img
              img
              img
              img

              既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

              由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

              如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
              img

              最后

              如果你已经下定决心要转行做编程行业,在最开始的时候就要对自己的学习有一个基本的规划,还要对这个行业的技术需求有一个基本的了解。有一个已就业为目的的学习目标,然后为之努力,坚持到底。如果你有幸看到这篇文章,希望对你有所帮助,祝你转行成功。

              CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

              外链图片转存中…(img-RITfBip0-1711716825571)]
              [外链图片转存中…(img-9F40AXIW-1711716825572)]
              [外链图片转存中…(img-SG9mFLAp-1711716825573)]
              [外链图片转存中…(img-uxdhDmn5-1711716825573)]
              [外链图片转存中…(img-ymMVcajN-1711716825573)]

              既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

              由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

              如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
              [外链图片转存中…(img-bB6hEEoQ-1711716825574)]

              最后

              如果你已经下定决心要转行做编程行业,在最开始的时候就要对自己的学习有一个基本的规划,还要对这个行业的技术需求有一个基本的了解。有一个已就业为目的的学习目标,然后为之努力,坚持到底。如果你有幸看到这篇文章,希望对你有所帮助,祝你转行成功。

              CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

            评论
            添加红包

            请填写红包祝福语或标题

            红包个数最小为10个

            红包金额最低5元

            当前余额3.43前往充值 >
            需支付:10.00
            成就一亿技术人!
            领取后你会自动成为博主和红包主的粉丝 规则
            hope_wisdom
            发出的红包
            实付
            使用余额支付
            点击重新获取
            扫码支付
            钱包余额 0

            抵扣说明:

            1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
            2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

            余额充值