美文网首页React Native
React Native代码规范

React Native代码规范

作者: 游侠_6fb7 | 来源:发表于2019-09-26 21:01 被阅读0次

    React Native基于0.43.4拆包后代码规范

    可能造成Crash或功能失效

    1.使用变量要做判断保护
    ❌错误用法:
    let userInfo;
    <Text>{userInfo.name}</Text> //TypeError: Cannot read property ‘name’ of undefined
    ✅正确用法:
    let userInfo;
    <Text> {userInfo && userInfo.name ? userInfo.name : ''}</Text>

    1. 定时器的环境dealloc,但是定时器没有置为nil,则会崩溃
      ❌错误用法:
      componentDidMount() {
      setTimeout(
      () => { console.log('把一个定时器的引用挂在this上'); },
      500
      );
      }
      ✅正确用法:
      componentDidMount() {
      this.timer = setTimeout(//这里如果多次调用的话,需要先clearTimeout再赋值,否则效果是一样的
      () => { console.log('把一个定时器的引用挂在this上'); },
      500
      );
      }
      componentWillUnmount() {
      // 如果存在this.timer,则使用clearTimeout清空。
      // 如果你使用多个timer,那么用多个变量,或者用个数组来保存引用,然后逐个clear
      this.timer && clearTimeout(this.timer);
      }
      3.for(let value of data)
      会造成CRASH,在debug上正常,release时crash
      4.android <Text>组件如果出现string和int等混排时,点击会崩溃
      使用number.toString()
      ❌错误用法:
      let num = 10;
      <Text>有{num}给你点赞</Text> //崩溃
      ✅正确用法:
      let num = 10;
      <Text>有{num.toString()}给你点赞</Text>
      5.Anroid Text无法设置touch事件
      6.Android Text 中无法嵌套Image
      7.Android Text无法设置border
      8.IOS 6p 上设置Border 为0.5造成布局错乱

    代码规范

    1.去掉导入无用的JS
    目前RN采用拆包方式
    如果导入无用的JS,会造成单页面的JS bundle文件增大,打包会把无用的js打进包里

    1. 节点中无子节点时采用<xxx/>
      如:
      <xxxx></xxxx>
      应改为:
      <xxx/>
      3.模块下的图片,放入一个图片文件夹
      避免相同图片,采用不同名称,便于统一管理
      如文件目录形式:
      tnhotel
      --images
      --icon_rn_xxx@2x.png
      --planehotel
      xxx.js
      4.图片统一采用@2x.png
      编译时会编译到统一文件夹
      5.使用图片是统一采用icon_rn_xxx.png |
      使用时不要带icon_rn_xxx@2x.png
      使用时用:
      <Image source={require('./images/icon_rn_xxx.png')}/>
      如果使用
      require('./images/icon_rn_xxx@2x.png')
      编译后,会多生成多个分辨率的图片文件
      6.js文件命名尽量短
      js编译时没有混淆;
      命名短有效减小js文件大小
      7.使用let,禁止使用var
      8.参数间传值,同一类的采用对象封装
      如城市:
      departureCityName: '上海',
      departureCityCode: '2500',
      departureDomestic: '1'
      采用对象封装:
      startCity:{
      departureCityName: '上海',
      departureCityCode: '2500',
      departureDomestic: '1'
      }
      传入下一个页面时:
      <Cityxxx startCity={startCity}/>
      避免写多个,也方便另一页面使用
      9.模块直接页面对象传值,A页面传入到B页面
      如:
      startCity:{
      departureCityName: '上海',
      departureCityCode: '2500',
      departureDomestic: '1',
      }
      传入下一个页面时:
      <B startCity={startCity}/>
      在B页面接收值时采用:
      let startCity = (typeof this.props.startCity) === 'string' ? JSON.parse(this.props.startCity):this.props.startCity;
      Android页面间传值都是string类型;IOS可直接传输对象
    2. 语句结束符采用";"结束
      如果不用,肯能会有不可预知的问题发生
      如:导入
      import storage from '@xxxx/rn-storage'
      import LoadingDialog from '@xxxx/rn-loading';
      import storage from '@xxxx/rn-storage'后面没有";"可能会发生运行出错;
      11.import到index页面的js,一定要加上
      shouldComponentUpdate
      控制diff计算,提高页面性能
      如:shouldComponentUpdate(nextProps, nextState) {
      return nextProps.imgUrl != this.props.imgUrl ||
      nextState.domainColor != this.state.domainColor; }

    代码架构规范

    1.@xxx/ 下的JS更改
    先本地修改debug调试,提交到npm库
    联系负责人发布;
    重新打comm包上传到BBT
    common包不会每次重打,每次有修改才打,若不打,release包会crash

    2.js/common文件夹下的文件修改
    重新打comm包上传到BBT
    common包不会每次重打,每次有修改才打,若不打,release包会crash
    3.页面有两个以上的网络请求使用redux框架
    使用redux,数据单向流动,便于数据更改,控制,页面扩展
    如机酒打包购物车页面:
    case ACTION.GET_DEFALULT_RECOMEND:
    return {
    ...state,
    data: action.data,
    error: action.error,
    pricePackage: {},//还原验价数据
    flightResult:{}//还原十分钟刷新数据
    };
    break;
    case ACTION.CHECK_PRICE_PACKAGE:
    return {
    ...state,
    pricePackage: action.data
    };
    break;
    case ACTION.GET_CHANGE_RESOURCE:
    return {
    ...state,
    data: action.data,
    error: action.error,
    pricePackage: {},//还原验价数据
    flightResult:{}//还原十分钟刷新数据
    };
    break;
    请求网络数据后:需要联动还原或更改其它数据,避免在view页面中到处修改

    4.页面item最小化
    页面中有很多模块,每个模块作为一个jS,
    1、便于控制刷新;
    2、便于扩展
    5.新加模块,需在
    moduleConfig.js中添加注册
    _packer.sh 中添加编译配置模块;
    _update.sh 添加拉代码
    新加模块如:
    tnmail 模块,具体可查看对应文件中的内容
    6.新加页面时,在
    route.js
    routePath.js
    中分别添加新页面注册
    route.js提供debug包使用,写法如
    planeHotelShop: require('./tnplanehotel/pages/ShopProvider')
    routePath.js 提供给release包使用,写法如:
    planeHotelShop: './tnplanehotel/pages/ShopProvider'
    区别:
    debug添加加require
    原因:debug包需要拉到所有的js进行打包
    release包按需解析打包;

    7.导入包时禁止导入文件夹
    如:
    import Images from '../assets;
    导入时需具体写导入哪个js文件或图片
    import xxx from '../assets/xxx.js;
    若不这样,拆包编译时会导入文件下无用的js;

    8.添加图片前先压缩
    添加图片前先用压缩工具压缩图片,如:ImageOptim 压缩

    相关文章

      网友评论

        本文标题:React Native代码规范

        本文链接:https://www.haomeiwen.com/subject/zzgfectx.html