react学习一篇就够了 (6)

以前我们需要自己基于subscribe向事件池追加方法,以达到容器状态信息改变,执行我们追加的方法,重新渲染组件的目的,但是现在不用了,react-redux帮我们做了这件事:'所有用到redux容器状态信息的组件,都会向事件池中追加一个方法,当状态信息改变,通知方法执行,把最新的状态信息作用属性传递给组件,组件的属性值改变值改变了,组件也会重新渲染

////把redux容器中的状态信息遍历,赋值给当前组件的属性(state) let mapStateToProps=state=>{ //state就是redux容器中状态信息 //我们返回的是啥,就把它挂载到当前组件的属性上(redux存储很多信息,我们想用啥就返回啥即可) return { ...state.vote } }; //把redux的dispatch 派发行为遍历,也复制给组件的属性(ActionCreator) let mapDispatchToProps=dispatch=>{ //dispatch:store中存储的dispatch方法 //返回的是啥,就想当于把啥挂载到组件的属性上(一般我们挂载一些方法,这 // 些方法完成dispatch派发信息 return { init(initData) { dispatch(action.vote.init(initData)); } } }; export default connect([mapStateToProps],[mapDispatchToProps])(VoteBase) ======================= export default connect({state=>({...state.vote})},action.vote)(VoteBase) react-redux把action-creator中编写方法(返回action对象的方法),自动构造dispatch派发任务的方法,也就是mapDispatchToProps这种格式把redux容器中的状态信息遍历,赋值给当前组件的属性(state)

todo实例

单页面应用(SPA)多页面应用(MPA)

多页面应用(MPA)

一个项目由很多页面组成,使用这个产品,主要就是页面之间的跳转(pc端多页面应用居多);

基于框架开发的时候,需要在webapck中配置多入口,每一个入口对应一个页面;

单页面应用(SPA)

只有一个页面,所有需要展示的内容都在这一个页面中实现切换,webapck只需要配置一个入口即可

移动端单页面应用居多或者pc端系统类也是单页面应用为主

如何实现单页面应用

弊端: 由于首页中的内容包含了所有模块的信息,所以第一次加载速度很慢

解决vue/react 实现模块化组件化开发,基于他们提供的路由实现SPA单页面应用,基于webpack打包

路由

yarn add react-router-dom

BrowerRouter

浏览器路由

基于H5中history API(pushState,replaceState,popstate)来保持url和ui的同步

真实项目中应用不多,一般只有当前是基于服务器渲染的,我们才会使用浏览器路由

<BrowserRouter basename="/calendar"> <Link to="/today" /> </BrowserRouter> //最后呈现的地址 /calendar/today

basename:string

所有位置的基准URL,basename的正确格式是前面有一个斜杠,但是尾部不能有

getUserConfirmation:func (这个有点不太懂)

用于确认导航函数,默认使用window.confirm

// 使用默认的确认函数 const getConfirmation = (message, callback) => { const allowTransition = window.confirm(message) callback(allowTransition) } <BrowserRouter getUserConfirmation={getConfirmation}/>

keyLength:number

location.key的长度,默认是6

<BrowserRouter keyLength={12} />

children:node

单个子元素

HashRouter

哈希路由

真实项目中(前后端分离的项目:客户端渲染),我们经常使用哈希路由来完成的

基于原生js构造了一套类似于history API的机制,每一次路由切换都是基于window.location.hash 完成的

hash-router只能出现一个子元素

route

path:设置匹配地址,但是默认不是严格匹配,当前页面哈希地址只要包含完整的它(内容是不变的,都能匹配上)

path='http://www.likecs.com/' 和它匹配的只有要斜杆就可以

component :一旦哈希值和当前router的path相同了,则渲染component执行的组件

exact: 让path的匹配严谨一些

strict:不常用,但是要要加/

render: 权限校验,渲染组件之前验证是否存在权限,不存在做一些特殊处理

Switch组件可以解决这个问题,和switch case 一样,只要有一种校验成功,就不再向后校验 <HashRouter> <Switch> <Route path={'http://www.likecs.com/'} exact component={A}>AAA</Route> <Route path={'/user'} component={B}/> <Route path={'/pay'} render={() => { let flag = localStorage.getItem('flag'); if (flag && flag === 'safe') { return <C/> } return '权限不安全'; }}/> //上述都设置完成后,会在末尾设置一个匹配:以上都不符合的情况下,我们路由地址是违法的 //(不设置path就是匹配所有的地址规则) <Route render={ ()=>{ return <div>404</div> }}/> //重定向 //to [string] // <Redirect to='http://www.likecs.com/'/> </Switch> </HashRouter>

basename:string 所有位置的基准URL

Link

react-router提供的路由切换组件

原理: 基于Link组件渲染,渲染后的结果就是A标签,To对应的信息最好变成href中的内容

to:string 一个字符串连接

to:object 一个对象的时候,下面属性

pathname - 要链接到的路径

search - 查询参数

hash - URL 中的 hash,例如 #the-hash

state - 存储到 location 中的额外状态数据

<Link to={{ pathname: '/courses', search: '?sort=name', hash: '#the-hash', state: { fromDashboard: true } }} />

replace:bool(默认是false) 替换history stack中当前的地址(true),还可以追加一个新的地址(false)

react-router中提供的组件必须在HashRouter或者BrowerRouter里面

NavLink

跟link类似,都是为了实现路由切换跳转的,不同在于,nav-link组件在当前页面hash和组件对应地址相吻合的时候,会默认给组件加一个active样式,让其选中态

Nav-Link不是点击谁,谁有选中的样式(但是可以路由切换),当前页面哈希后的地址和Nav-Link中的to进行比较,哪个匹配了,哪个才有选中的样式

to和replace等属性都有,用法一样

activeClassName:把默认的active样式改为自己设定的

activeSyle:把匹配的这个nav-link设置行内样式

exact & strict控制匹配的时候是否是严格匹配

isActive: 匹配后执行对应的函数

with-Router

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfxfs.html