先描述下需求吧。
从服务端获取菜单栏要展示的菜单项(如校园公告,乐课网,课程消息,乐答消息,作业消息,...,待办通知),其中校园公告,乐课网和代办通知是一定会有的菜单项(下文称为“常驻嘉宾”),而消息类(如课程消息,乐答消息,作业消息,...)根据运营后台的配置不同而不同(下文称为“本期特邀嘉宾”)。
接口返回数据
:
实现思路:
根据type区分不同菜单类型,故可以用type来区分不同路径url。
消息类只是数据不同,页面结构完全相同,用的是同一个组件homeworkNotice。此处涉及动态路由(/homeworkNotice:type).
由于动态路由必须采用“/xxx/:变量”的形式。
写了个方法,为“常驻嘉宾”和“本期特邀嘉宾”设置不同的路由规则。
如此“本期特邀嘉宾”便有了符合动态路由规则的url。调用时如下:
针对出现的“本期特邀嘉宾”之间切换时页面不刷新的问题
,做出如下分析:
切换路由时,只是重新render,并未重新构建。
要想在切换路由时组件重新构建,重新完成一次生命周期,就需要给render组件加上key。
至此,完美解决。
btw
:
如果你对是否结束此次生命周期并没有特别的要求,也可以通过componentDidUpdate(preProps)钩子 函数,或者componentWillReceiveProps(nextProps)判断props.match.params.type是否发生改变。如果变化,手动调用获取数据的接口。
我的这个需求中,需要在componentWillUnmount()方法中调用已读接口,将未读变成已读,所以菜单栏切换时必须要结束本次生命周期。
今天学习了
react
的重点知识
路由
,这个知识点是
react
中的一大块,大家有兴趣的话可以跟随作者的文章继续学习呦
SPA的理解
单页Web应用(single page web application,SPA)。
整个应用只有一个完整的页面。
点击页面中的链接不会
刷新
页面,只会做页面的局部更新。
数据都需要通过ajax请求获取, 并在前端异步展现。
路由
的理解
① 什么是
路由
?
一个
路由
就是一个映射关系(key:value)
key为路径, value可能是function或component
如标题所说的问题,更详细一点就是多个router使用
同一个
react
页面
组件
的时候,当
切换
路由
的时候,页面
组件
不重新构建,页面也不
刷新
。例如:router.jsimport Index from './routes/Index/index';
import UserAccount from './routes/UserAccount/index';const Root = () =>(
当多个
路由
使用
同一个
组件
的时候,
切换
路由
的时候,页面
组件
不重新构建,页面也不
刷新
当
切换
路由
的时候,只是重新render,并不重新构建,如果需要
路由
切换
的时候,
组件
重新构建,重新完成一次生命周期,则需要给
组件
加上key
路由
不需要修改,我们只需要修改
组件
,给
组件
加上key,让router的path属性(params)指向
组件
的key,就可以...
React
Router DOM 通过基于JavaScript的导航技术,可以实现
路由
切换
而不
刷新
整个页面。只需要使用
React
Router DOM 的
组件
,将你的页面中的链接替换为它就可以了。举例来说,你可以将这样的链接:用户详情 替换为这样:用户详情。这样就可以实现
路由
切换
而不
刷新
整个页面。
在开发当中,我们经常会有编辑、新建操作,一些初学者经常写成两个
组件
,这样做的话会导致代码非常冗余,那么如何让编辑、新建
共用
一个
组件
呢?
新建和编辑,往往结构都是一样的,主要是编辑有数据回显,而新建没有
1、先写好Modal
组件
2、新建编辑两个不同的按钮绑定两个不同的事件,在事件中控制
同一个
框是否打开(上图中的isModelVisible),并且在各自事件中传入一个type,用来区分点击的是新建还是编辑,并且设置不同的title(上图中的modelTitle),以下是我的编辑绑定事件
从上文已经提及,编
挂载阶段:
constructor() -----> 初始化构造函数
static getDerivedStateFromProps() -------->计算属性,必须有返回值,如果没有则return null
return出来的值会合并到state中
render() ---------> 渲染函数
componentDidMount() ----------
组件
挂载完毕执行
更新阶段:
static getDerivedStateFro
分析中两个重要
组件
和,分别起到导航作用和内容渲染作用,但是回答如何生效还真有一定难度回答范例包括以下几个模块回答范例思路回答范例可能的追问可以分来以下三种:1. 默认插槽子
组件
用标签来确定渲染的位置,标签里面可以放结构,当父
组件
使用的时候没有往插槽传入内容,标签内结构就会显示在页面父
组件
在使用的时候,直接在子
组件
的标签内写入内容即可子
组件
2. 具名插槽子
组件
用属性来表示插槽的名字,不传为默认插槽父
组件
中在使用时在默认插槽的基础上加上属性,值为子
组件
插槽属性值子
组件
3. 作用域插槽子
组件
在
多数情况下大家都会采用componentWillReceiveProps(nextProps){}这个函数去解决
路由
跳转不
刷新
页面的问题,但是我自己的项目中并不适用,对于自己遇到的问题也只是做个记录,并非针对普遍情况,仅供参考!
使用一个中转页面,a?p=1----- b ----- a?p=1,这样就可以再执行初始化的一些列行为了
使用useEffect在依赖项里强制加了window.location.href就达到
刷新
的效果了,虽然控制台会报不是有效依赖项,但暂时先这样解决着,后
在使用
react
的history.push()方法进行
路由
跳转时,
组件
重复加载两次。代码案例如下:
this.props.history.push(`/xxx/xxxx?title=参数`)
后面多次检查代码后发现,是在使用history.push()方法时,参数值为中文才会出现该问题,其他类型则不会出现该问题。
仔细追究其原因,应该是在进行带参数跳转时,浏览器会自动对中文进行转码,然后又会导致router的history方法监听浏览器地址栏变化。也就
1.router引入
import { Route, IndexRoute, Router, hashHistory, browserHistory } from '
react-router
';
<Router routes={routes} history={browserHistory}/>
假设store结构如下,分别是主页home,详情页detail,评论页com...
一、遇到问题的原因:
项目中
React-router
都是一级
路由
,当
路由
跳转的时候那个
组件
会被卸载掉,当返回那个
组件
的时候
组件
是重新构建的,componentdidmount会重置store中的数据,但是又不能用嵌套
路由
,嵌套
路由
会把
路由
到的所有
组件
都渲染出来。如果把加载store的函数放到父级
组件
的时候,当在本页面
刷新
浏览器的时候会找不到数据而报错。
二、解决办法: