以下文章是本人在学习中搜集所得,来自尚硅谷视频教学。
扶程星云 2023年7月
目录
组件化编程流程
功能界面的组件化编程流程
1、拆分组件:拆分界面,抽取组件
2、实现静态组件:使用组件实现静态页面效果
3、实现动态组件
3.1 动态显示初始化数据
3.1.1 数据类型
3.1.2 数据名称
3.1.3 保存到哪个组件?
3.2 交互(从绑定事件监听开始)
4、注意defaultChecked和checked的区别,类似的还有:defaultValue和value
5、状态在哪里,操作状态的方法就在哪里
通信和订阅消息
1.【父组件】给【子组件】传递数据:通过props传递
2.【子组件】给【父组件】传递数据:通过props传递,要求父提前给子传递一个函数
1、消息名
2、发布消息
路由
路由的基本使用
1、明确好界面中的导航区、展示区
2、导航区的a标签改为Link标签
<Link to ="/xxxxx">Demo</Link>
3、展示区写Route标签进行路径的匹配
<Route path='/xxxx' component={Demo} />
4、<App>的最外侧包裹了一个<BrowserRouter>或<HashRouter>
路由组件与一般组件
1、写法不同:
一般组件:<Demo/>
路由组件:<Route path="/demo" component={Demo} />
2、存放位置不同:
一般组件:components
路由组件:pages
3、接收到的props不同:
一般组件:写组件标签时传递了什么,就能收到什么
路由组件:接收到三个固定的属性
NavLink与封装NavLink
1、NavLink可以实现路由链接的高亮,通过activeClassName指定样式名
2、标签体内容是一个特殊的标签属性
3、通过this.props.children可以获取标签体内容
Switch的使用
1、通常情况下,path和component是一一对应的关系。
2、Switch可以提高路由匹配效率(单一匹配)。
解决多级路径刷新页面样式丢失的问题
1、public/index.html中,引入样式时不写 ./ 写 /(常用)
2、public/index.html中,引入样式时不写 ./ 写 %PUBLIC_URL%(常用)
3、使用HashRouter
路由的严格匹配与严格匹配
1、默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
2、开启严格匹配:<Route exact={true} paht="/about" component={About}/>
3、严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
Redirect的使用
1、一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
2、具体编码:
<Switch>
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
<Redirect to="/about"/>
</Switch>
嵌套路由
1、注册子路由时要写上父路由的path值
2、路由的匹配是按照注册路由的顺序进行的
向路由组件传递参数
1、params参数
路由链接(携带参数):<Link to='/demo/test/tom/18'>详情</Link>
注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>
接收参数: this.props.match.params
2、search参数
路由链接(携带参数):<Link to='/demo/test?name=to?name=tom&age=18'}>详情</Link>
注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
接收参数: this.props.location
备注:获取到的search是urlencoded编码字符串,需要借助querystring解析
3、state参数
路由链接(携带参数):<Link to={{path:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
接收参数: this.props.location.state
备注:刷新也可以保留住参数
编程式路由导航
借助this.props.history对象上的API对操作路由跳转、前进、后退
-this.props.history.push()
-this.props.history.replace()
-this.props.history.goBack()
-this.props.history.goForward()
-this.props.history.go()
BrowserRouter与HashRouter的区别
1.底层原理不一样
BrowserRouter使用的是H5的History_API,不兼容IE8及以下版本。
HashRouter使用的是URL的哈希值.
2.URL表现形式不一样
BrowserRouter的路径中没有#,例如:localhost:3000/#/demo/test
3.刷新后对路由state参数的影响
(1).BrowserRouter没有任何影响,因为state保存在history对象中
(2) HashROuter刷新后会导致路由state参数的丢失.
4.备注:HashRouter可以用于解决一些路径错误相关的问题。