[React-Native]開發(fā)規(guī)范文檔

React-Native開發(fā)規(guī)范

標(biāo)簽(空格分隔): React-Native JavaScript

一场刑、編程規(guī)約

(一) 命名規(guī)約

  1. 【強(qiáng)制】 代碼中命名均不能以下劃線或美元符號(hào)開始,也不能以下劃線或美元符號(hào)結(jié)束;

    `_name / $Object / name_ / name$ / Object$`
    
  2. 【強(qiáng)制】 代碼中命名嚴(yán)禁使用拼音與英文混合的方式凉蜂,更不允許直接使用中文的方式算墨; 說明:正確的英文拼寫和語法可以讓閱讀者易于理解掘殴,避免歧義。注意爹谭,即使純拼音命名方式 也要避免采用;

    `反例: DaZhePromotion [打折] / getPingfenByName() [評(píng)分] / int 某變量 = 3`
    
  3. 【強(qiáng)制】類名使用 UpperCamelCase 風(fēng)格榛搔,必須遵從駝峰形式诺凡,第一個(gè)字母必須大寫东揣;
    LoginPage/MsgPage

  4. 【強(qiáng)制】方法名、參數(shù)名腹泌、成員變量嘶卧、局部變量都統(tǒng)一使用 lowerCamelCase風(fēng)格,必須遵從駝峰形式真屯,第一個(gè)字母必須小寫脸候;

    localValue / getHttpMessage() / inputUserId

  5. 【強(qiáng)制】常量命名全部大寫,單詞間用下劃線隔開绑蔫,力求語義表達(dá)完整清楚运沦,不要嫌名字長;
    正例: MAX_STOCK_COUNT 反例: MAX_COUNT

  6. 【強(qiáng)制】使用抽象單詞命名類名或者變量時(shí)配深,需加以修飾携添;
    userMsg 等價(jià)于 userMessaage, userPic 等價(jià)于 userPicture

  7. 【強(qiáng)制】中括號(hào)是數(shù)組類型的一部分,數(shù)組定義如下:String[] args;
    反例:請(qǐng)勿使用String args[]的方式來定義篓叶。

  8. 【強(qiáng)制】包名統(tǒng)一使用小寫烈掠,點(diǎn)分隔符之間有且僅有一個(gè)自然語義的英語單詞。包名統(tǒng)一使用單數(shù)形式缸托,但是類名如果有復(fù)數(shù)含義左敌,類名可以使用復(fù)數(shù)形式;
    正例: 應(yīng)用工具類包名為com.fcs.open.util俐镐、類名為UrlUtils

  1. 【強(qiáng)制】文件夾命名統(tǒng)一小寫矫限; 組件,或者類名,首字母全部大寫佩抹,遵守駝峰命名法叼风;

     img    存放圖片
     app    APP一些component
     artcomponent    一些art組件
    


(二) 常量定義

  1. 【強(qiáng)制】不允許出現(xiàn)任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中;
  2. 【推薦】不要使用一個(gè)常量類維護(hù)所有常量棍苹,應(yīng)該按常量功能進(jìn)行歸類无宿,分開維護(hù)。
    如:緩存相關(guān)的常量放在類:CacheConsts下;
    系統(tǒng)配置相關(guān)的常量放在類:ConfigConsts下; 說明:大而全的常量類,非得使用查找功能才能定位到修改的常量腐螟,不利于理解和維護(hù);


(三) 格式規(guī)約

  1. 【強(qiáng)制】大括號(hào)的使用約定梭灿。如果是大括號(hào)內(nèi)為空,則簡潔地寫成{}即可冰悠,不需要換行;如果 是非空代碼塊則:
  1. 左大括號(hào)前不換行堡妒;
  2. 左大括號(hào)后換行;
  3. 右大括號(hào)前換行溉卓;
  4. 右大括號(hào)后還有else等代碼則不換行‘皮迟;’表示終止右大括號(hào)后必須換行搬泥。
  1. 【強(qiáng)制】 左括號(hào)和后一個(gè)字符之間不出現(xiàn)空格;同樣,右括號(hào)和前一個(gè)字符之間也不出現(xiàn)空格伏尼;
  2. 【強(qiáng)制】if/for/while/switch/do 等保留字與左右括號(hào)之間都必須加空格忿檩;
  3. 【強(qiáng)制】任何運(yùn)算符左右必須加一個(gè)空格;
    說明:運(yùn)算符包括賦值運(yùn)算符=爆阶、邏輯運(yùn)算符&&燥透、加減乘除符號(hào)、三目運(yùn)行符等辨图;
  4. 【強(qiáng)制】縮進(jìn)采用 4 個(gè)空格班套,禁止使用 tab 字符;
  5. 【強(qiáng)制】單行字符數(shù)限制不超過120個(gè)故河,超出需要換行吱韭,換行時(shí)遵循如下原則:
  1. 第二行相對(duì)第一行縮進(jìn)4個(gè)空格,從第三行開始鱼的,不再繼續(xù)縮進(jìn)理盆,參考示例;

  2. 運(yùn)算符與下文一起換行凑阶;

  3. 方法調(diào)用的點(diǎn)符號(hào)與下文一起換行猿规;

  4. 在多個(gè)參數(shù)超長,逗號(hào)后進(jìn)行換行宙橱;

     const path = Path()
             .moveTo(0, -radius/2)
             .arc(0, radius, 1)
             .arc(0, -radius, 1)
             .close();
    
  1. 【強(qiáng)制】方法參數(shù)在定義和傳入時(shí)姨俩,多個(gè)參數(shù)逗號(hào)后邊必須加空格;

     onMsgByCallAndMsg=(msg, title, type)=>{
         this.setState({
             callMsgAndMsg:msg
         })
     }
    
  2. 【推薦】方法體內(nèi)的執(zhí)行語句組养匈、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個(gè)空行都伪。相同業(yè)務(wù)邏輯和語義之間不需要插入空行呕乎。
    說明:沒有必要插入多行空格進(jìn)行隔開。

  3. 【推薦】使用webStorm時(shí)陨晶,導(dǎo)入附件的hoop-settings-1.0.jar文件猬仁,可統(tǒng)一格式化。


(四) package.json

  1. 【強(qiáng)制】在使用npm或者yarn獲取資源時(shí)先誉,必須在命令末尾添加--save湿刽;
    說明:使用此命令會(huì)把使用的第三方相關(guān)信息寫入到package.json,這樣褐耳,其他成員在下載或者更新代碼后使用npm i诈闺,就可以下載最新的npm,若不加 —save 铃芦,執(zhí)行npm i的時(shí)候不會(huì)下載雅镊,其他成員運(yùn)行項(xiàng)目后在運(yùn)行可能會(huì)報(bào)錯(cuò)襟雷,此時(shí)需要分析查看報(bào)錯(cuò)信息進(jìn)行重新的npm install XX;

  2. 【推薦】使用git或者svn進(jìn)行代碼版本管理時(shí)仁烹,盡量不上傳node_module文件耸弄;
    說明:使用package.json進(jìn)行包管理,下載或更新代碼后卓缰,只需要執(zhí)行npm i计呈;當(dāng)有修改npm包,建議進(jìn)行版本管理征唬,上傳到私有的github倉庫捌显。

  3. 【強(qiáng)制】使用第三方或拉取新倉庫時(shí),第一步使用npm i或者npm install鳍鸵;
    說明:檢查版本是否存在沖突

  4. 【推薦】在使用npm或者yarn獲取資源時(shí)苇瓣,推薦不在命令后添加 -g;
    說明偿乖,此命令可以讓此資源包在根目錄進(jìn)行獲取击罪,不利于資源管理;

  5. 【強(qiáng)制】當(dāng)升級(jí)或降級(jí)react-native版本時(shí)贪薪,必須進(jìn)行代碼備份媳禁;
    說明:升級(jí)失敗或者涉及到原生代碼時(shí),可以進(jìn)行代碼回滾

  6. 【強(qiáng)制】每個(gè)項(xiàng)目必須配置一個(gè)readMe文件画切,內(nèi)容包括測試竣稽,正式環(huán)境等相關(guān)配置文件以及注意事項(xiàng);

  7. 【推薦】安裝npm包是霍弹,推薦~來標(biāo)記版本號(hào)毫别;
    說明:和^的作用和區(qū)別:會(huì)匹配最近的小版本依賴包,比如~1.2.3會(huì)匹配所有1.2.x版本典格,但是不包括1.3.0
    會(huì)匹配最新的大版本依賴包岛宦,比如1.2.3會(huì)匹配所有1.x.x的包,包括1.3.0耍缴,但是不包括2.0.0砾肺。那么該如何選擇呢?當(dāng)然你可以指定特定的版本號(hào)防嗡,直接寫1.2.3变汪,前面什么前綴都沒有,這樣固然沒問題蚁趁,但是如果依賴包發(fā)布新版本修復(fù)了一些小bug裙盾,那么需要手動(dòng)修改package.json文件;和^則可以解決這個(gè)問題。但是需要注意^版本更新可能比較大闷煤,會(huì)造成項(xiàng)目代碼錯(cuò)誤童芹,舊版本可能和新版本存在部分代碼不兼容。所以推薦使用來標(biāo)記版本號(hào)鲤拿,這樣可以保證項(xiàng)目不會(huì)出現(xiàn)大的問題假褪,也能保證包中的小bug可以得到修復(fù)。


(五) 控制語句

  1. 【強(qiáng)制】在一個(gè) switch 塊內(nèi)近顷,每個(gè)case要么通過 break/return 等來終止生音,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè) case 為止;在一個(gè) switch 塊內(nèi),都必須包含一個(gè)default 語句并且 放在最后窒升,即使它什么代碼也沒有缀遍。

  2. 【強(qiáng)制】在 if/else/for/while/do 語句中必須使用大括號(hào),即使只有一行代碼饱须,避免使用 下面的形式:
    if (condition) statements;

  3. 【推薦】推薦盡量少用 else域醇, if-else 的方式可以改寫成:

     if(condition){
                   ...
     return obj; }
    

// 接著寫 else 的業(yè)務(wù)邏輯代碼;
說明:如果非得使用

if()
...
else if(

)...else...

方式表達(dá)邏輯,【強(qiáng)制】請(qǐng)勿超過3層蓉媳,
超過請(qǐng)使用狀態(tài)設(shè)計(jì)模式譬挚。
正例:邏輯上超過 3 層的 if-else 代碼可以使用衛(wèi)語句,或者狀態(tài)模式來實(shí)現(xiàn)酪呻。

4.【推薦】使用三目運(yùn)算减宣,替換if else結(jié)構(gòu),精簡代碼

let   account=5;
if(account>10){
        console.log("true");
}else {
        console.log("false");
}

let msg=account>10?"true":"false";

5.【推薦】除常用方法(如 getXxx/isXxx)等外玩荠,不要在條件判斷中執(zhí)行其它復(fù)雜的語句漆腌,將復(fù) 雜邏輯判斷的結(jié)果賦值給一個(gè)有意義的布爾變量名,以提高可讀性阶冈。
說明:很多 if 語句內(nèi)的邏輯相當(dāng)復(fù)雜闷尿,閱讀者需要分析條件表達(dá)式的最終結(jié)果,才能明確什么 樣的條件執(zhí)行什么樣的語句女坑,那么填具,如果閱讀者分析邏輯表達(dá)式錯(cuò)誤呢?

        //偽代碼如下
boolean existed = (file.open(fileName, "w") != null)&& (...) || (...); 
        if (existed) {
            ... 
         }

(六) 注釋規(guī)約

  1. 【強(qiáng)制】類、類屬性堂飞、類方法的注釋必須使用 Javadoc 規(guī)范灌旧,使用/*內(nèi)容/格式绑咱,不得使用 //xxx 方式绰筛;
    說明:在 IDE 編輯窗口中,Javadoc 方式會(huì)提示相關(guān)注釋描融,生成 Javadoc 可以正確輸出相應(yīng)注釋;在 IDE 中铝噩,工程調(diào)用方法時(shí),不進(jìn)入方法即可懸浮提示方法窿克、參數(shù)骏庸、返回值的意義毛甲,提高閱讀效率。

  2. 【強(qiáng)制】所有的類都必須添加創(chuàng)建者信息具被,以及類的說明玻募;

  3. 【強(qiáng)制】方法內(nèi)部單行注釋,在被注釋語句上方另起一行一姿,使用//注釋七咧;
    方法內(nèi)部多行注釋使用/* */注釋,注意與代碼對(duì)齊叮叹。

  4. 【強(qiáng)制】所有的常量類型字段必須要有注釋艾栋,說明每個(gè)值的用途;

  5. 【參考】注釋掉的代碼盡量要配合說明蛉顽,而不是簡單的注釋掉蝗砾。
    說明:代碼被注釋掉有兩種可能性:
    1)后續(xù)會(huì)恢復(fù)此段代碼邏輯。
    2)永久不用携冤。前者如果沒有備注信息悼粮,難以知曉注釋動(dòng)機(jī)。后者建議直接刪掉(代碼倉庫保存了歷史代碼)噪叙。

  6. 【參考】對(duì)于注釋的要求:
    第一矮锈、能夠準(zhǔn)確反應(yīng)設(shè)計(jì)思想和代碼邏輯;
    第二、能夠描述業(yè)務(wù)含義睁蕾,使別的程序員能夠迅速了解到代碼背后的信息苞笨。完全沒有注釋的大段代碼對(duì)于閱讀者形同 天書,注釋是給自己看的子眶,即使隔很長時(shí)間瀑凝,也能清晰理解當(dāng)時(shí)的思路;注釋也是給繼任者看的,使其能夠快速接替自己的工作臭杰。

  7. 【參考】好的命名粤咪、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡準(zhǔn)確渴杆、表達(dá)到位寥枝。避免出現(xiàn)注釋的一個(gè)極端:過多過濫的注釋,代碼的邏輯一旦修改磁奖,修改注釋是相當(dāng)大的負(fù)擔(dān)囊拜。

  1. 【參考】特殊注釋標(biāo)記,請(qǐng)注明標(biāo)記人與標(biāo)記時(shí)間比搭。注意及時(shí)處理這些標(biāo)記冠跷,通過標(biāo)記掃描,經(jīng)常清理此類標(biāo)記。
  1. 待辦事宜(TODO):( 標(biāo)記人蜜托,標(biāo)記時(shí)間抄囚,[預(yù)計(jì)處理時(shí)間]) 表示需要實(shí)現(xiàn),但目前還未實(shí)現(xiàn)的功能橄务。
  2. 錯(cuò)誤幔托,不能工作:(標(biāo)記人,標(biāo)記時(shí)間蜂挪,[預(yù)計(jì)處理時(shí)間])
    在注釋中用 FIXME標(biāo)記某代碼是錯(cuò)誤的柑司,而且不能工作,需要及時(shí)糾正的情況锅劝。

(七) 日志管理

  1. 【推薦】 代碼中過多使用console.log()會(huì)消耗性能攒驰,推薦去除不必要的日志輸入代碼;

  2. 【強(qiáng)制】 在入口文件添加以下代碼故爵;
    說明:可以在發(fā)布時(shí)屏蔽掉所有的console.*調(diào)用玻粪。React Native中有一個(gè)全局變量DEV用于指示當(dāng)前運(yùn)行環(huán)境是否是開發(fā)環(huán)境。我們可以據(jù)此在正式環(huán)境中替換掉系統(tǒng)原先的console實(shí)現(xiàn)诬垂。

     if (!__DEV__) {
       global.console = {
         info: () => {},
         log: () => {},
         warn: () => {},
         error: () => {},
       };
     }
    

這樣在打包發(fā)布時(shí)劲室,所有的控制臺(tái)語句就會(huì)被自動(dòng)替換為空函數(shù),而在調(diào)試時(shí)它們?nèi)匀粫?huì)被正常調(diào)用结窘。

(八) 目錄結(jié)構(gòu)規(guī)范

    以下目錄結(jié)構(gòu)示例中只展示js與靜態(tài)資源很洋,不包含原生代碼:
├── index.ios.js
├── index.android.js
└── js
    ├── component           可復(fù)用的組件(非完整頁面)
    ├── controller                  完整頁面
    ├── data                配置項(xiàng)(常量、接口地址隧枫、路由喉磁、多語言化等預(yù)置數(shù)據(jù))
    ├── utils               工具類(非UI組件)
    ├── common              公共
    └── assets              圖片
在component和controller目錄中,可能還有一些內(nèi)聚度較高的模塊再建目錄

controller/component
├── HomeView.component.js
├── HomeView.style.js
└── MovieView
    ├── MovieList.component.js          
    ├── MovieList.style.js          
    ├── MovieCell.component.js          
    ├── MovieCell.style.js              
    ├── MovieView.component.js          
    └── MovieView.style.js              

二官脓、頁面編寫規(guī)范

(一) state,props

  1. 【強(qiáng)制】 代碼中初始化state因在constructor(props)函數(shù)中协怒,而且盡量對(duì)每個(gè)變量進(jìn)行注釋;

  2. 【強(qiáng)制】 代碼中使用setState時(shí)卑笨,因注意異步可能導(dǎo)致的問題孕暇,盡量使用回調(diào)函數(shù);

     this.setState({
            //todo 
         },()=>{
            //執(zhí)行setState后執(zhí)行此函數(shù)
         })
    
  3. 【強(qiáng)制】 代碼中使用props時(shí)赤兴,需進(jìn)行propTypes檢測和defaultProps默認(rèn)值初始化妖滔;

     static propTypes = {
             color: PropTypes.string,
             dotRadius: PropTypes.number,
             size: PropTypes.number
         };
     
     static defaultProps = {
             color: '#1e90ff',
             dotRadius: 10,
             size: 40
         };
    

4.【強(qiáng)制】 代碼中用于頁面展示處理UI的組件,命名以Page結(jié)尾桶良,自定義組件命名中必須包含Component座舍;
例子:

 LoginController           登錄頁
 BtuuonComponent     按鈕組件

5.【強(qiáng)制】代碼中創(chuàng)建數(shù)組或?qū)ο笫褂靡韵路绞剑?/p>

const user={
        name:'time',
        sex:'男',
        age:25,
    };

const itemArray=['0','1','2',3,{name:'25',age:'男'}];

6.【強(qiáng)制】代碼中函數(shù)綁定this,強(qiáng)制使用箭頭函數(shù)艺普;
注:除組件原有方法簸州,其他自定義函數(shù)命名時(shí),需使用箭頭函數(shù)歧譬;

//系統(tǒng)組件生命周期方法
constructor(props){
    super(props);
};
//自定義方法
goMainPage=()=>{
    
};

7.【推薦】代碼中一些網(wǎng)絡(luò)數(shù)據(jù)初始化岸浑,配置信息,推薦在此生命周期進(jìn)行初始化瑰步;

componentWillMount

8.【強(qiáng)制】代碼中使用定時(shí)器或者DeviceEventEmitter矢洲,必須在組件卸載進(jìn)行銷毀或者清除;

componentDidMount() {
    //注意addListener的key和emit的key保持一致
    this.msgListener = DeviceEventEmitter.addListener('Msg',(listenerMsg) => {
        this.setState({
            listenerMsg:listenerMsg,
        })
    });
}

goMainPage=()=>{
    this.timer = setTimeout(
        () => { console.log('把一個(gè)定時(shí)器的引用掛在this上'); },
        500
    );
};


componentWillUnmount() {
    //此生命周期內(nèi)缩焦,去掉監(jiān)聽和定時(shí)器
    this.msgListener&&this.msgListener.remove();
    // 如果存在this.timer读虏,則使用clearTimeout清空。
    // 如果你使用多個(gè)timer袁滥,那么用多個(gè)變量盖桥,或者用個(gè)數(shù)組來保存引用,然后逐個(gè)clear
    this.timer && clearTimeout(this.timer);
}

9.【強(qiáng)制】使用本地圖片資源時(shí)题翻,需設(shè)置寬高并進(jìn)行適當(dāng)適配揩徊;

 imgHeight=screenHeight, imgWidth= screenWidth

10.【強(qiáng)制】在React-Native版本小于0.46.0使用本地圖片資源時(shí),當(dāng)不指定特殊尺寸圖片時(shí)嵌赠,需引入不同尺寸XX.png,XX2@.png,XX3@.png圖片塑荒,并在代碼引用中,使用如下方式:

<Image style={{flex: 1, height: screenHeight, width: screenWidth}}
      source={require('../XX.png')}>

說明:當(dāng)使用XX.png時(shí)姜挺,程序運(yùn)行過程中會(huì)根據(jù)不同屏幕尺寸獲取不同資源齿税;當(dāng)使用如下方式:

<Image style={{flex: 1, height: screenHeight, width: screenWidth}}
           source={require('../XX2@.png')}>

時(shí),程序運(yùn)行過程中不會(huì)根據(jù)不同屏幕尺寸獲取不同資源炊豪。
注意:此方式適用于React-Native0.46.0版本之前凌箕。

9.【強(qiáng)制】在React-Native版本大于0.46.0使用本地資源,圖片命名不能出現(xiàn)‘@’符號(hào):
說明:不同大小圖片需要原生不同的尺寸文件夾词渤,系統(tǒng)自動(dòng)進(jìn)行不同適配陌知。

(二) 樣式

  1. 【強(qiáng)制】 當(dāng)組件使用樣式屬性達(dá)到三個(gè)或者三個(gè)以上時(shí),必須使用StyleSheet來創(chuàng)建樣式屬性并進(jìn)行引用掖肋;

     const styles = StyleSheet.create({
         container: {
             flex: 1,
             justifyContent: 'center',
             alignItems: 'center',
             backgroundColor: '#F5FCFF',
             marginTop:10,
         },
     });
    
  2. 【推薦】 當(dāng)使用單一屬性仆葡,或者全局樣式屬性時(shí),推薦使用公共樣式類志笼;

     //StyleCommon.js
     module.exports={
         topColor:{
             backgroundColor: '#3A3D42',
         },
         mainView:{
             backgroundColor: '#12141B',
         },
     }
    
  3. 【推薦】 當(dāng)使用多個(gè)state或者props值時(shí)沿盅,推薦使用以下方式;

      const {size, dotRadius, color} = this.props;
      const { maxNumber,minNumber,}=this.state;
    

說明使用此方式纫溃,代碼結(jié)構(gòu)清晰簡潔腰涧,便于維護(hù);

(三) var,let,const

  1. 【強(qiáng)制】對(duì)所有變量紊浩,對(duì)象的引用窖铡,使用const,不要使用var;
  2. 【推薦】如果一定需要引用可變動(dòng)的變量疗锐,對(duì)象,建議使用let代替var;

(四) 代碼間隔

  1. 【強(qiáng)制】使用ES6編寫代碼费彼,定義方法時(shí)滑臊,每個(gè)方法結(jié)尾使用‘;’進(jìn)行分隔;

(五) 其他

  1. 【強(qiáng)制】對(duì)組件引用箍铲,變量引用雇卷,需遵從以下方式;

     import React, {Component} from 'react';
     import{
               View,
               Text,
               TouchableHighlight,
               Image,
               StyleSheet,
               InteractionManager,
     } from 'react-native';
     //from react,react-native優(yōu)先;
     //from npm庫其次颠猴;
     import { connect } from 'react-redux';
              
     //from 項(xiàng)目內(nèi)組件其次关划;
     import LoadingAndTime from '../component/LoadingAndTime';
     import { performLoginAction } from '../action/LoginAction'
     import {encode} from '../common/Base64';
     
     //變量初始化,常量初始化 最后翘瓮;
     let screenWidth = Dimensions.get('window').width;
     let screenHeight = Dimensions.get('window').height;
     let typeCode = Platform.OS == 'android' ? 'android-phone' : 'ios-phone'
     let selectColor=Platform.OS=='android'?null:'white'
    
  2. 【推薦】對(duì)組件引用贮折,變量初始化等,在整個(gè)頁面或組件內(nèi)未使用资盅,因去除相關(guān)代碼;

  3. 【推薦】某些全局變量請(qǐng)不要使用global脱货,需新建文件進(jìn)行導(dǎo)出引用;
    NetUtil.get(global.url + “”)

  4. 【推薦】render()函數(shù)代碼過長時(shí)律姨,請(qǐng)適當(dāng)進(jìn)行拆分振峻,拆分為‘‘頁面內(nèi)組件‘‘,提高可讀性择份。render()函數(shù)代碼行請(qǐng)勿超過八十行扣孟,超過之后,請(qǐng)自行進(jìn)行拆分荣赶;


三凤价、編碼約定

(一)入口文件

1.【推薦】統(tǒng)一入口文件為App.js;
說明:在index.android.js和index.ios.js文件中,統(tǒng)一入口文件為App.js,且保持所在目錄和index.android.js和index.ios.js同級(jí)拔创。

2.【強(qiáng)制】開發(fā)中利诺,不要使用任何后端的開發(fā)模式來構(gòu)建APP結(jié)構(gòu),如使用MVC,MVP,MVVM等開發(fā)模式剩燥,React-Native推薦組件化慢逾,顆粒化灭红,以上設(shè)計(jì)模式嚴(yán)重違背侣滩。若使用Redux,Mobx等數(shù)據(jù)流第三方,可依據(jù)第三方結(jié)構(gòu)編寫構(gòu)建App变擒。

3.【推薦】某些輸入框的值君珠,放入到state中,并且設(shè)置defaultValue娇斑,不要使用全局變量進(jìn)行引用,參照以下方式:

 constructor(props) {
    super(props);
    this.state = {
        editSalesPrice:'',  //修改后的商品售價(jià)
        editPurchasePrice:'', //修改后的商品進(jìn)價(jià)
    };
}

render(){
  return(
  <View style={styles.viewPadding}>
                       <TextInput
                            style={styles.rowInput}
                            placeholder="請(qǐng)輸入調(diào)整后的價(jià)格"
                            onChangeText={(text)=>{
                                this.setState({
                                    editSalesPrice:text,
                                })
                            }}
                            defaultValue={this.state.editSalesPrice}
                            placeholderTextColor='#B0B7C2'
                            underlineColorAndroid = 'transparent'
                            autoCapitalize={'none'}
                            autoCorrect={false}
                            clearButtonMode={'while-editing'}
                            keyboardType='numeric'
                        />
                    </View>
                    );
}

4.【強(qiáng)制】移除定時(shí)器策添,監(jiān)聽請(qǐng)按照如下代碼進(jìn)編寫材部;

componentWillUnmount() {
    //此生命周期內(nèi),去掉監(jiān)聽和定時(shí)器
    this.msgListener && this.msgListener.remove();
    // 如果存在this.timer唯竹,則使用clearTimeout清空乐导。
    this.timer && clearTimeout(this.timer);
}

(二) 模版文件

1.【推薦】根據(jù)附件,配置代碼編寫模版摩窃,推薦使用第二種配置方式,可配置多種模版芬骄。

(三) ListView,FaltList

1.【強(qiáng)制】使用ListView或者FaltList的renderRow時(shí)猾愿,需對(duì)renderRow里面的組件需進(jìn)行抽取,使用一個(gè)單獨(dú)組件進(jìn)行包裹账阻,類似于頁面子組件方式引入蒂秘;
請(qǐng)勿使用如下方式:

renderRow(news) {
   return (
        <TouchableOpacity onPress={() => {
            this.onPress(news)
        }} style={styles.container}>
            <Image source={require('../imgs/icon_data.png')}/>
            <View style={styles.row_main}>
                <Text style={styles.row_title}>{news.belOutlet}</Text>

                <Text style={styles.row_bottom}>所屬支行:{news.belBranch}</Text>
            </View>
            {this._renderNewFlag(news)}
        </TouchableOpacity>
     );
}

推薦使用如下方式:

import GoodInCell from './GoodInCell';
renderRow(news) {
    return (
        <GoodInCell  news={news}  />
    );
}

說明:使用此方式淘太,可增加代碼的可讀性和理解性姻僧。更符合組件化的開發(fā)思路。


四蒲牧、自定義組件

(一) 自定義組件

  1. 【強(qiáng)制】組件命名中必須包含Component;
    說明:

    ButtonComponent.js
    LabelComponent.js

  2. 【強(qiáng)制】組件中定義的state和props必須都要有注釋撇贺,依次說明每個(gè)值的含義;

  3. 【強(qiáng)制】在每個(gè)類的頭部注釋中,必須使用/**/說明此組件的基礎(chǔ)使用方式以及特殊使用方法冰抢;

(二) 屬性判斷

  1. 【強(qiáng)制】代碼中使用props時(shí)松嘶,需進(jìn)行propTypes檢測和defaultProps默認(rèn)值初始化;

    static propTypes = {
    color: PropTypes.string,
    dotRadius: PropTypes.number,
    size: PropTypes.number
    };

    static defaultProps = {
    color: '#1e90ff',
    dotRadius: 10,
    size: 40
    };

2.【強(qiáng)制】代碼中使用props方法時(shí)挎扰,具體參照以下方式進(jìn)行調(diào)用翠订;

    export default class PostCallMsgToPar extends  Component {
        render() {
            return (
            <View style={styles.container}>
                <TouchableOpacity onPress={this.postMsgByCallBack}>
                <Text>使用Callback修改父狀態(tài),無返回值</Text>
                </TouchableOpacity>
            </View>
            );
        }

    postMsgByCallBack=()=>{
            if(this.props.onChangeMsg){
                this.props.onChangeMsg();
            }
        }
    }

(三) 性能優(yōu)化

  1. 【強(qiáng)制】無狀態(tài)組件需使用PureComponent而不是Component遵倦;
    說明:無狀態(tài)組件是指內(nèi)部沒有使用state的組件尽超,但是可以使用props來進(jìn)行某些屬性控制;

    export default class LinkButton extends PureComponent {
    static defaultProps= {
    msgName:'請(qǐng)輸入此事件函數(shù)名!'
    };

     static  propTypes={
         msgName:PropTypes.string.isRequired,
         onPressCall:PropTypes.func,
     };
    
    
     render() {
         return (
             <View style={styles.container}>
                 <TouchableOpacity onPress={this.onPressCall} >
                     <View>
                         <Text>{this.props.msgName}</Text>
                     </View>
                 </TouchableOpacity>
             </View>
         );
     }
    
     onPressCall=()=>{
         if(this.props.onPressCall){
             this.props.onPressCall();
         }
     }
    

    }

2.【推薦】使用InteractionManager.runAfterInteractions梧躺,在動(dòng)畫或者某些特定場景中利用InteractionManager來選擇性的渲染新場景所需的最小限度的內(nèi)容似谁;
使用場景類似于:

    class ExpensiveScene extends React.Component {
      constructor(props, context) {
        super(props, context);
        this.state = {renderPlaceholderOnly: true};
      }
    
      componentDidMount() {
        InteractionManager.runAfterInteractions(() => {
          this.setState({renderPlaceholderOnly: false});
        });
      }
    
      render() {
        if (this.state.renderPlaceholderOnly) {
          return this.renderPlaceholderView();
        }
    
        return (
          <View>
            <Text>Your full view goes here</Text>
          </View>
        );
      }
    
    
      renderPlaceholderView() {
        return (
          <View>
            <Text>Loading...</Text>
          </View>
        );
      }
    };

說明:更多使用于Navigator的頁面跳轉(zhuǎn)
3.【推薦】使用新版本組件替換舊辦法組件;
例如:FlatList替換ListView掠哥,React Navigation替換Navigator等

4.【推薦】在使用Touchable系列組件時(shí)棘脐,進(jìn)行setState或者大量調(diào)幀操作,請(qǐng)使用如下方式:

handleOnPress() {
          this.requestAnimationFrame(() => {
             //todo
          });
     }




五龙致、安全規(guī)約

  1. 【強(qiáng)制】用戶敏感數(shù)據(jù)禁止直接展示蛀缝,必須對(duì)展示數(shù)據(jù)脫敏; 說明:查看個(gè)人手機(jī)號(hào)碼會(huì)顯示成:158****9119,隱藏中間 4 位目代,防止隱私泄露

  2. 【強(qiáng)制】請(qǐng)求傳入任何參數(shù)必須做有效性驗(yàn)證;避免過度請(qǐng)求服務(wù)屈梁,造成服務(wù)器壓力嗤练,或者雙向校驗(yàn);
    如:驗(yàn)證手機(jī)號(hào)長度在讶,是否是手機(jī)號(hào)等煞抬;

六、其他

  1. 【推薦】開發(fā)工具使用WebStorm,安裝ESLint插件進(jìn)行代碼檢測构哺,代碼中不要出現(xiàn)使用ESLint檢查出的錯(cuò)誤;
    說明:變量命名規(guī)范革答,使用var或者const錯(cuò)誤

  2. 【推薦】在WebStorm中導(dǎo)入附件的hoop-settings.jar文件,進(jìn)行代碼格式化曙强,提交的任何代碼残拐,都需要進(jìn)行格式化〉欤快捷鍵是option+command+L溪食。

請(qǐng)點(diǎn)擊這里查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市娜扇,隨后出現(xiàn)的幾起案子错沃,更是在濱河造成了極大的恐慌,老刑警劉巖雀瓢,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枢析,死亡現(xiàn)場離奇詭異,居然都是意外死亡刃麸,警方通過查閱死者的電腦和手機(jī)登疗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫌蚤,“玉大人辐益,你說我怎么就攤上這事⊥阎ǎ” “怎么了智政?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箱蝠。 經(jīng)常有香客問我续捂,道長,這世上最難降的妖魔是什么宦搬? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任牙瓢,我火速辦了婚禮,結(jié)果婚禮上间校,老公的妹妹穿的比我還像新娘矾克。我一直安慰自己,他們只是感情好憔足,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布胁附。 她就那樣靜靜地躺著酒繁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪控妻。 梳的紋絲不亂的頭發(fā)上州袒,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弓候,去河邊找鬼郎哭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菇存,可吹牛的內(nèi)容都是我干的夸研。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼撰筷,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼陈惰!你這毒婦竟也來了畦徘?” 一聲冷哼從身側(cè)響起毕籽,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎井辆,沒想到半個(gè)月后关筒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杯缺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年蒸播,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍肆。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袍榆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塘揣,到底是詐尸還是另有隱情包雀,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布亲铡,位于F島的核電站才写,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奖蔓。R本人自食惡果不足惜赞草,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吆鹤。 院中可真熱鬧厨疙,春花似錦、人聲如沸疑务。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搭独,卻和暖如春婴削,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牙肝。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工唉俗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人配椭。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓虫溜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親股缸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衡楞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • GUIDS 第一章 為什么使用React? React 一個(gè)提供了用戶接口的JavaScript庫敦姻。 誕生于Fac...
    jplyue閱讀 3,538評(píng)論 1 11
  • 自己最近的項(xiàng)目是基于react的瘾境,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒開始讀...
    潘逸飛閱讀 3,392評(píng)論 1 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評(píng)論 25 707
  • 昨天也是這個(gè)時(shí)間镰惦,接到一個(gè)電話迷守,:阮阿姨咱們要緊急加播一則關(guān)于王寶強(qiáng)離婚的片子,下午就要播出…旺入。 明白了兑凿,意思就是...
    丙由甲桂花兒閱讀 141評(píng)論 11 3
  • Objective-C 中的消息與消息轉(zhuǎn)發(fā) 1.Objective-C方法調(diào)用 我們知道objc的消息機(jī)制是由運(yùn)行...
    JimmyOu閱讀 426評(píng)論 0 0