关于git使用和IDE使用
良好的开发习惯
- 多人协作开发页面注意点:
- 有小改动记住git add . git commit -m “desc**”
- push前一定要git pull拉代码报冲突后解决冲突再 git push
- 以前一直有个疑问就是什么时候用git init 什么时候用git clone 两者又有什么区别:
在对项目进行“git clone”之前,是否需要“git init”
所以一般在公司私服上建立了仓库,你想把本地仓库和它连起来上传第一版代码时用到git init
- 关于IDE
- 问题引入:wsl下向私服上push代码经常出现permission denied 并且重新设置用户名密码后仍然不能解决问题,建议使用webstorm操作
- git指令:git教程
git checkout
命令用于切换分支或恢复工作树文件
(尤其是git pull的时候提示你有些文件修改了建议先git add. git commit -m ""的时候你不想提交这些改变可以git checkout xx分支 xx文件)(但一般没必要这么做)
git merge
命令用于将两个或两个以上的开发历史加入(合并)一起。
git stash
命令用于将更改储藏在脏工作目录中。
- 关于webstorm的使用
es6 promise
不管是成功状态的回调函数还是失败状态的回调函数,resolve reject只能传递一个参数(传递多了也只认第一个),所以多参数建议传对象。
dva dispatch回调
实现方式有多种:
看到Dva2.0发布日志中提出dva2.0+版本支持回调,具体实现方式就是effects里面记得return数据即可。
路由
-
Q:dva路由跳转的方式,什么时候用this.props.history,为什么有的页面props里面没有history属性。
-
需要了解withRouter高阶组件:react withRouter
— 好了,现在整理一下整个问题:
- 首先:关于react-router react-router-dom不再赘述,在我的react学习笔记系列(一)里有简单介绍。
- 被Route包裹的组件会有location,match,history等属性,通过this.props获取即可。–这样因为,有些组件并没有被包裹所以它的props里面就没有history等属性,那么怎么才能有呢?
-
- 若它是包裹的组件的子组件,那么我们可以把history从父组件的props里面拿出来再作为props传给子组件。
- 使用withRouter,withRouter是一个高阶组件返回的就是包裹的组件,此时就有this.props.history了。
- 网上一些方法:react-router v4 使用 history 控制路由跳转
- 关于路由鉴权:
- 比较机械的判断用户登录状态等利用location或者history进行页面跳转
- 我在项目中常使用react-router-config这个小助手像vue一样配置静态路由,拓展一下用它做路由鉴权的方法:利用react-router4的react-router-config做路由鉴权
- 其他方法:在dva.js中如何拦截路由(做登录认证),没有类似vue中的beforeEach钩子函数
react父子组件传值
- 业务中经常做的是父组件给子组件传值,但是子组件向父组件传值有时也会遇到:
总结:父写好state和处理该state的函数,同时将函数名通过props属性值的形式传入子,子调用父的函数,同时引起state变化。
dva项目中传递数据
引入:业务场景:假设我在入口文件已经dispatch一个action把用户信息放在store中,我必须拿到用户信息中的token才能请求下一步的数据A,但是一个组件里我一方面connect取到用户信息,一方面也要取到数据A,明显两者都要从store中拿值,并且是用拿到的token请求A,所以我针对这个问题有两个解决方案:
- 一个组件内解决:组件根据token请求数据A,在组件里componentDidMount里面使用延迟50msdispatch获取数据A,使用特点:父子组件请求数据可以放在一起,但是请求数据的时机一定要分开。
- 两个组件内解决:父组件拿到用户信息后根据这个信息有无决定子组件是否渲染,子组件使用models里面的select函数取到state中的用户信息值再用call请求数据A。使用特点:父组件connect取store数据和子组件connect取store数据分离。
- 当然在业务逻辑比较简单的情况下:最最最建议的方式还是用dispatch回调
※ 使用原则总结:
- 尽量不用setTimeout,所以尽量使用第二种方法,但是当时项目没有用是基于想要使用scroll组件的loadMoreData所以要在同一个组件里面使用,但事实上可以在store中没有数据时处理scroll组件不能上拉加载,然后在store中有数据之后再处理loadMoreData;
- 至于为什么在componentDidMount里面取不到我们入口文件请求的用户信息数据呢:可以参考React 嵌套组件树生命周期,这里总结一下react组件树的渲染过程:其实是遍历到叶子节点将子组件整个生命周期走完后再回溯,回溯到父组件,所以我们的子组件componentDidMount完成后父组件才componentDidMount取到userInfo,所以需要延迟一段时间(或者说下一次事件循环的时候)才能取到userInfo.
正则
-
在做金额转换的时候又又又跟正则打交道了:
可以看一下:正则表达式中?=和?:和?!的理解结合千位分割符的理解