原生項(xiàng)目(hot)集成react-native

最近react-native(以下簡(jiǎn)稱(chēng)rn)的技術(shù)越來(lái)越活,國(guó)內(nèi)的使用情況也越來(lái)越多,國(guó)內(nèi)的氛圍也越來(lái)越好收壕,其實(shí)我是從去年就接觸了一下rn妓灌,當(dāng)時(shí)我學(xué)習(xí)了一個(gè)多星期轨蛤,然后剛好處于要換工作就沒(méi)有學(xué)習(xí)了,剛好最近有點(diǎn)空閑的時(shí)間虫埂,就再次去學(xué)習(xí)祥山,只能說(shuō)rn的更新速度太快了,很多之前的寫(xiě)法都變了掉伏,只能從頭開(kāi)始缝呕,但是一整個(gè)項(xiàng)目都采用rn來(lái)構(gòu)建還不是很現(xiàn)實(shí),所以國(guó)內(nèi)很多的也是集成rn斧散,所以我也來(lái)湊湊熱鬧供常。
1:添加依賴(lài)

compile "com.facebook.react:react-native:+" // From node_modules

在項(xiàng)目的build.gradle下添加

allprojects {
   repositories {
       mavenLocal()
       jcenter()
       maven {
           // All of React Native (JS, Android binaries) is installed from npm
           url "$rootDir/node_modules/react-native/android"
       }
   }
}

2:在app的實(shí)現(xiàn)ReactApplication接口,以下是部分代碼

 */
public class App extends Application implements ReactApplication{

    private static App appContext;
    private static AppComponent mAppComponent;

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        protected boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage()
            );
        }
    };

3:在AndroidManifest.xml加入

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>

加入以下的activity可以在搖一搖出現(xiàn)rn的配置頁(yè)面。
4:寫(xiě)個(gè)activity來(lái)繼承ReactActivity

public class MainActivity extends ReactActivity {

    /**
     * Returns the name of the main component registered from JavaScript.
     * This is used to schedule rendering of the component.
     */
    @Override
    protected String getMainComponentName() {
        return "MyHot";
    }
}

在這里介紹一篇大帥寫(xiě)的React Native 0.31 Bundle 預(yù)加載優(yōu)化主要解決從原生頁(yè)面到rn頁(yè)面會(huì)有短暫的白屏鸡捐。使用方法

dependencies {
    compile "com.github.moduth:react-native-preloader:0.31.0"
}

把之前繼承ReactActivity變成繼承MrReactActivity

public class MyReactActivity extends MrReactActivity {
    public static final ReactInfo reactInfo = new ReactInfo("MyHot", null);


    @Override
    protected String getMainComponentName() {
        return reactInfo.getMainComponentName();
    }

    @Override
    public ReactInfo getReactInfo() {
        return reactInfo;
    }
}

在調(diào)用rn頁(yè)面調(diào)用

ReactPreLoader.init(this, MyReactActivity.reactInfo);

這樣就能很好的解決上述的問(wèn)題栈暇。
在rn中我引入了redux,以下就貼出關(guān)鍵行代碼箍镜,在最外層

import configureStore from './store/store.js'

import App from './containes/App.js'

const store = configureStore();

class rootApp extends Component {
    render() {
        return (
            <Provider store={store}>
               <App/>
            </Provider>
        )
    }
}
export default rootApp;

同時(shí)個(gè)actions的文件夾里面放著各種的操作源祈,以下是我的newsList的代碼

import * as types from "../constants/ActionTypes.js";
import * as Services from "../utils/Services.js";
import {
    NEW_LIST
} from "../constants/Urls.js";


export function fetchNews(loading, isRefresh, isLoadMore, pn) {
    return dispatch => {
        dispatch(fetchNewsList(loading, isRefresh, isLoadMore));
        Services.getNewList(NEW_LIST, pn)
            .then(result => {
                dispatch(receiveNewsList(result));
            });
    }
}

function fetchNewsList(loading, isRefresh, isLoadMore) {
    return {
        type: types.FE_NEWLIST,
        loading: loading,
        isRefresh: isRefresh,
        isLoadMore: isLoadMore
    };
}

function receiveNewsList(newsList) {
    return {
        type: types.RE_NEWLIST,
        newsList: newsList
    }
}

還有就是ruducers文件夾下的和action所對(duì)應(yīng)的

import * as types from '../constants/ActionTypes';

const initialState = {
    loading: true,
    isRefresh: false,
    isLoadMore: false,
    newsList: []
}

export default function revicesNewsList(state = initialState, action) {
    switch (action.type) {

        case types.FE_NEWLIST:
            return Object.assign({}, state, {
                loading: action.loading,
                isRefresh: action.isRefresh,
                isLoadMore: action.isLoadMore,

            });
        case types.RE_NEWLIST:
            return Object.assign({}, state, {
                loading: false,
                isRefresh: false,
                isLoadMore: false,
                newsList: state.isLoadMore ? state.newsList.concat(action.newsList) : action.newsList,
            });

        default:
            return state;
    }
}

還有就是一個(gè)轉(zhuǎn)化的

import {
 connect
} from 'react-redux';
import News from "../pages/News.js";
import {
 bindActionCreators
} from 'redux';
import * as newsAction from '../actions/newsList.js';
class NewsContainer extends Component {

 render() {
   return (
     <News {...this.props} />
   );
 }
}

function mapStateToProps(state) {
 const {
   news
 } = state;
 return {
   news
 }
}

function mapDispatchToProp(dispatch) {
 return {
   actions: bindActionCreators(newsAction, dispatch)
 };
}

export default connect(mapStateToProps, mapDispatchToProp)(NewsContainer);

這樣在使用的時(shí)候就是調(diào)用action的方法

 componentDidMount() {
    const {
      actions
    } = this.props;
    actions.fetchNews(true, false, false, page);
  }

接受到數(shù)據(jù)

 render() {
      const {
        navigator,
        news
      } = this.props;
      return (
        <View style={styles.container}>
      <Header title="體育" navigator= {navigator}/>
      {this.renderContent()}
      </View>

      )
    }

這樣以后要是添加新的頁(yè)面就很清楚了,在action里面添加動(dòng)作色迂,在reducers添加action的處理器香缺,這樣就很清晰了。
我添加了一個(gè)Services歇僧,來(lái)獲取數(shù)據(jù)

const HOST = "http://apis.baidu.com/";
import FetchHttpClient, {
    query,
    header
} from 'fetch-http-client';
import {
    toastShort
} from "./ToastUtil.js";

let client = new FetchHttpClient(HOST);

export function getNewList(url, pnSize) {

    return getClient().get(url, {
            query: {
                num: 10,
                pn: pnSize
            },
        }).then(filterJSON)
        .then(filterStatus)
        .catch((error) => {
            toastShort('網(wǎng)絡(luò)發(fā)生錯(cuò)誤,請(qǐng)重試!')
        });
}

function getClient() {
    client.addMiddleware(query());
    client.addMiddleware(request => {
        request.options.headers['apikey'] = 'ff27ef67506b2c0738a3252b01f8d564';
    });
    return client;
}

function filterStatus(res) {
    if (res.code === 200) {
        return res.newslist;
    } else {
        toastShort(res.msg);
    }
}

function filterJSON(res) {
    return res.json();
}

本人rn的水平有限图张,要是有不對(duì)的地方,還請(qǐng)指出和諒解诈悍。本文的所以代碼在github地址祸轮,歡迎star。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末写隶,一起剝皮案震驚了整個(gè)濱河市倔撞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慕趴,老刑警劉巖痪蝇,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鄙陡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡躏啰,警方通過(guò)查閱死者的電腦和手機(jī)趁矾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)给僵,“玉大人毫捣,你說(shuō)我怎么就攤上這事〉奂剩” “怎么了蔓同?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹲诀。 經(jīng)常有香客問(wèn)我斑粱,道長(zhǎng),這世上最難降的妖魔是什么脯爪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任则北,我火速辦了婚禮,結(jié)果婚禮上痕慢,老公的妹妹穿的比我還像新娘尚揣。我一直安慰自己,他們只是感情好掖举,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布快骗。 她就那樣靜靜地躺著,像睡著了一般拇泛。 火紅的嫁衣襯著肌膚如雪滨巴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天俺叭,我揣著相機(jī)與錄音恭取,去河邊找鬼。 笑死熄守,一個(gè)胖子當(dāng)著我的面吹牛蜈垮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裕照,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼攒发,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了晋南?” 一聲冷哼從身側(cè)響起惠猿,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎负间,沒(méi)想到半個(gè)月后偶妖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姜凄,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年趾访,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了态秧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扼鞋,死狀恐怖申鱼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情云头,我是刑警寧澤捐友,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站盘寡,受9級(jí)特大地震影響楚殿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竿痰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砌溺。 院中可真熱鬧影涉,春花似錦、人聲如沸规伐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猖闪。三九已至鲜棠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間培慌,已是汗流浹背豁陆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吵护,地道東北人盒音。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像馅而,于是被迫代替她去往敵國(guó)和親祥诽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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