50个项目 native react

2019-03-07 09:39:07 u013626215 阅读数 955

需要先安装npm

创建项目

react-native init ReactDemo 

通过npm安装最新版本

npm install

项目的android->app->src->main目录下创建一个名为assets空文件夹,执行如下命令

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

运行android项目

默认运行debug版本

react-native run-android 

运行release版本

  react-native run-android --variant=release 

我们摇一摇手机,点击Dev Settings后,点击Debug server host & port for device,
设置IP和端口(本机地址)。如:192.168.0.107:8081

修改完js文件,回到空白页面,再次摇一摇手机,选择Reload JS,程序就运行起来,可查看修改

===================================================

注意Android5.0以上版本命令方式:

打开Android SDK目录 xxx\Android\sdk\platform-tools。在当前文件路径呼出命令行,输入:

adb reverse tcp:8081 tcp:8081

点击Reload JS 即可成功拉取ReactNative bundle。

===================================================

2018-07-02 10:51:17 wtdask 阅读数 3107

总体感觉RN更新速度很快,一些老的教程都不合适新的版本。初学乍道,确实感觉很坑。废话不多说,我们直接跨过山越过海,直接撸个综合项目,进行RN的学习。据说FaceBook最近要对RN有重大版本的更新,不知道会更改到什么地步,希望会在模拟器的调试上变得更加方便一些。RN总体感觉比微信小程序墨迹多了,(ಥ_ಥ)

项目预览

这里写图片描述

ReactNative版本

react-native-cli: 2.0.1
react-native: 0.55.4

项目搭建

cd 需要创建项目的路径
react-native init babyShow(项目名称)

创建如下文件

这里写图片描述

account.js edit.js list.js picture.js 都填写如下代码
记得修改class名称和text内容

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
    Platform,
    StyleSheet,
    Text,
    View
} from 'react-native';

const instructions = Platform.select({
    ios: 'Press Cmd+R to reload,\n' +
    'Cmd+D or shake for dev menu',
    android: 'Double tap R on your keyboard to reload,\n' +
    'Shake or press menu button for dev menu',
});

export default class account extends Component{
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>
                    账户页面
                </Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
});

App.js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View
} from 'react-native';

import List from  './Component/List/list';
import Edit from  './Component/Edit/edit';
import Account from  './Component/Account/account';
import Picture from  './Component/Picture/picture';

export default class App extends Component{
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
         主要模块
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
});

使用TabBar组件

npm install react-native-scrollable-tab-view –save

图标库组件

npm install react-native-vector-icons –save

Link图片

react-native link

图标库地址

RAP地址

mock地址

将前面文章中自定义的WTTabBar.js文件复制到项目中。

修改WTTabBar.js文件

import React, { Component } from 'react';
import {
    Platform,
    StyleSheet,
    Text,
    View,
    AppRegistry,
    TouchableOpacity,
    Image,
    PixelRatio,
} from 'react-native';



import PropTypes from 'prop-types';
import Icon from 'react-native-vector-icons/Ionicons';


export default class WTTabBar extends Component {
    static propTypes={
        goToPage:PropTypes.func, //跳转到Tab的方法
        activeTab:PropTypes.number,//选中的下标
        tabs:PropTypes.array,//tabs的集合!像OC items的数组

        //接下来,拓展自定义的属性
        tabIconNames:PropTypes.array,//Item图片的名称
        tabNames:PropTypes.array,//文字的名字 
        tabIconSelectedName:PropTypes.array,//保存选中图片的集合
    }
    render() {
        return (
            <View style={styles.tabsStyle}>
                {/*返回一个一个的Item*/}
                {/*//遍历集合,返回对象和角标。调用回调方法,传递值tab,i*/}
                {this.props.tabs.map((tab,i)=>this.renderItem(tab,i))}
            </View>
        );
    }
    renderItem(tab,i){
        //判断i是否是当前选中的tab!
        const color = this.props.activeTab == i ? "orange":"black";

        return(
            <TouchableOpacity
                activeOpacity={1}//取消高亮
                onPress={()=>this.props.goToPage(i)}
                key={i}
                style={styles.tab}
            >
                <View style={styles.tabItem}>
                    <Icon 
                        name={this.props.tabIconNames[i]}
                        size={30}
                        color={color}
                    />
                    {/*文字*/}
                    <Text style={{color:color}}>{this.props.tabNames[i]}</Text>
                </View>

            </TouchableOpacity>
        )
    }
}

const styles = StyleSheet.create({
    tabsStyle:{
        flexDirection:'row',
        height:50
    },
    tabItem:{
        justifyContent:'center',
        alignItems:'center'
    },
    tab:{
        flex:1
    }
});

App.js文件

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View
} from 'react-native';

import List from  './Component/List/list';
import Edit from  './Component/Edit/edit';
import Account from  './Component/Account/account';
import Picture from  './Component/Picture/picture';

import WTTabBar from './WTTabBar';

import ScrollabelTabView,{DefaultTabBar,ScrollableTabBar} from 'react-native-scrollable-tab-view';

export default class App extends Component{

    constructor(props){
        super(props);
        this.state={
            tabNames:['视频','录制','图片','我的'],
            tabIconNames:['ios-videocam-outline','ios-recording','ios-reverse-camera','ios-contact']
        }
    }

  render() {
      let tabNames = this.state.tabNames;
      let tabIconNames = this.state.tabIconNames;
    return (
     <ScrollabelTabView
       renderTabBar={()=><WTTabBar tabNames={tabNames}  tabIconNames={tabIconNames}/>}
       tabBarPosition = "bottom"
       scrollWithoutAnimation = {true} //禁止滑动动画,但是仍可滑动
       locked = {true}  //禁止滑动
     >
         <List tabLel="list"/>
         <Edit tabLel="edit"/>
         <Picture tabLel="picture"/>
         <Account tabLel="account"/>
     </ScrollabelTabView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
});

运行效果

这里写图片描述

那么,项目的基本目录结构已经大致完成。

这里写图片描述

下一篇文章我们会继续学习ListView,页面渲染。

2016-11-25 15:02:16 asddavid 阅读数 2341

1、创建项目

进入你所想生成项目的路径终端执行
react-native init Test
这里写图片描述

因为初始化要经过node-gyp编辑,从nodejs下载源码 国内被墙,所以可以替换资源 如淘宝的。
替换镜像资源

终端下执行使用淘宝镜像。
npm config set registry=http://registry.npm.taobao.org/

2、创建成功后配置使用Android Studio 打开文件直接运行错误

这里写图片描述

错误日志:

这里写图片描述

错误原因没有启动服务器,在命令行使用 npm start 或者 react-native start来启动服务器打包到本地服务器。

再次运行app,运行成功 注意在运行时刻必须保持服务器的运行状态
这里写图片描述

3、常用的管理react-native 版本

  • 查看命令react-native –version
  • 更新版本命令 npm update -g react-native-cli
  • 查询npm最新版本npm info react-native
  • 指定插入某个版本 npm install –save react-native@版本号
2018-07-13 14:26:27 sinat_17775997 阅读数 1151

转载https://blog.csdn.net/xiangzhihong8/article/details/80594483

最近,很多的公司,特别是小公司、小项目,为了解决人力成本的问题,都开发将移动原生开发转到了跨平台开发,或者原生+h5的混合开发,今天要说的是如何在原生项目中集成React Native。

如果是一个新项目,并且以应用为主的,大可以使用React Native来进行开发,关于这方面的内容,不做讲解,读者可以查看我之前的博客,或者阅读《React Native移动开发实战》。

1,安装React Native

首先,在你的安卓项目的根目录下执行如下命令:

npm init
  • 1

操作完成之后,在你的Android项目根目录下会出现一个package.json文件。 
这里写图片描述 
package.json主要是项目的RN的依赖配置文件,其内容如下:

{
  "name": "kingtv",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^16.4.0",
    "react-native": "^0.51.1"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

从配置信息可以看出,react安装的是16.4.0,react-native安装的是0.51.1。然后执行命令:

 npm install
  • 1

此时,你会发现Android项目根目录下多了一个node_modules文件夹。 
然后使用如下命令安装React和React Native

npm install -save react
npm install -save react-native
  • 1
  • 2

2,依赖添加

配置Android项目react-native依赖库:

compile"com.facebook.react:react-native:+"//(+号代表使用最新版本)
  • 1

然后,添加NDK支持。

ndk {
   abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
  • 1
  • 2
  • 3

这里借用网络的一张图,我原生的项目的依赖比较多。 
这里写图片描述

然后在项目的根目录下的build.gradle中添加maven配置。

maven {
      url "$rootDir/node_modules/react-native/android"
    }
  • 1
  • 2
  • 3

如果上面配置的时候报如下错误:

Error:Conflict with dependency 'com.google.code.findbugs:jsr305' in project ':app'. Resolved versions for app (3.0.0) and test app (2.0.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
  • 1

请将下面的配置添加到app的build.gradle,配置的脚本信息如下:

android {
    configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5

到此,React Native的相关环境就配置完成了,接下来就可以编写代码了,下面我们以一个原生的页面跳转到React Native页面为例。

3, 实例

1、Application修改

想要项目中使用React Native,需要重写ReactNativeHost,一般的写法是直接在Application中做如下的添加。

public class RNApplication extends Application implements ReactApplication {

private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
        //注意:BuildConfig需要导入自己项目包名下的BuildConfig
        return BuildConfig.DEBUG;
    }

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

@Override
public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
}

@Override
public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

但是,由于我的项目的Application中的配置比较多,所以我将上的配置部分单独抽取出来,也就是下面的方式。 
这里写图片描述

2,创建index.android.js文件

然后我们在项目的根目录下创建index.android.js文件,文件的内容如下:

import React from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class HelloWorld extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.hello}>Hello, 我是React Native</Text>
      </View>
    )
  }
}
var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
  },
  hello: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});

AppRegistry.registerComponent('ReactHost', () => HelloWorld);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3,绑定原生界面

方法一

想要通过原生代码调用 React Native页面 ,我们需要在一个 Activity 中创建一个 ReactRootView 对象,将它关联一个 React application ,并将该界面设置为主视图。例如,ReactActivity的源码如下:

public class ReactHostActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mReactRootView = new ReactRootView(this);
        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setBundleAssetName("index.android.bundle")
                .setJSMainModuleName("index.android")
                .addPackage(new MainReactPackage())
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();

        // 注意这里的react-example必须对应“index.android.js”中的
        // “AppRegistry.registerComponent()”的第一个参数
        mReactRootView.startReactApplication(mReactInstanceManager, "ReactHost", null);

        setContentView(mReactRootView);
    }

    @Override
    public void invokeDefaultOnBackPressed() {
        super.onBackPressed();
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy();
        }
    }

    @Override
    public void onBackPressed() {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
            mReactInstanceManager.showDevOptionsDialog();
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

方法二

当然也可以使用继承自ReactActivity,然后重写getMainComponentName()即可。

public class ReactHostActivity extends ReactActivity  {
    @Nullable
    @Override
    protected String getMainComponentName() {
        return "ReactHost";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意这里的返回组件的名称和index.js文件中名称的对于关系。例如:

AppRegistry.registerComponent('ReactHost', () => ReactHost);
  • 1

由于ReactActivity 的许多组件都使用了 Theme.AppCompat.Light.NoActionBar这一主题 ,所以需要将ReactHostActivity的主题设置为Theme.AppCompat.Light.NoActionBar。

<activity 
      android:name=".ReactHostActivity"
      android:label="@string/app_name"
      android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        </activity>
  • 1
  • 2
  • 3
  • 4
  • 5

4,配置权限

如果你的项目还没有添加如下权限,需要先添加如下的权限。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  • 1
  • 2

为了简单,我们给原生项目的设置页面绑定一个跳转事件,使用Intent方式先跳转到ReactHostActivity页面即可。如图: 
这里写图片描述

5,启动云运行

要想运行混合的项目,需要先启动开发服务器(Packager),也就是启动React Native相关的环境,启动的命令如下:

npm start
  • 1

然后在Android Studio中启动Android原生项目,不出意外的话,当你点击项目的设置按钮的时候,将会看到js的加载渲染,不错这就是React Native在在加载js。 
这里写图片描述

这里写图片描述

到此,简单集成就ok了,然后就可以使用React Native愉快的开发了,下面给大家提供一个完整的RN学习项目:React Native美团项目

同时,如果大家在集成过程中遇到什么问题,欢迎大家留意,我会第一时间回复。

附:Android原生集成RN源码

2017-04-17 09:38:49 sinat_17775997 阅读数 13290

一、前言

先更正下,不然又有人要出来打假了。标题说是 50 个,但其实目前只有 43 个。那为啥标题非说 50 个?!可是如果叫《43 个完整.....》好像不太好听吧?嘿嘿~ 不过我是每个月 15 号左右去更新的,所以下个月肯定就超过 50 个了。

http://www.jianshu.com/p/470606826b12

顺便说下,最近买了一个的域名:http://www.marno.cn 。不过暂时还没想好放什么内容,就先用 Github Pages 搭了一个简单的网站,链接到了我整理的 React Native 优秀开源项目大全上。

经常在微信群里看到有一些正在学习 RN 的朋友在问,有没有什么比较适合入门的完整项目来参考学习下,今天就把我自己收藏的一些项目推荐给大家。各种各样的算是比较全了,其中也有一些是上线了的项目。下面直奔主题↓↓↓

二、项目列表

序号 名称/地址 简介 预览图
0 react-native-eyepetizer 模仿开眼3.1.2

1 GitHubPopular 这是一个用来查看GitHub最受欢迎与最热项目的App,它基于React Native支持Android和iOS双平台。

3 react-native-dribbble-app 模仿国外设计师网站Dribbble做的客户端

4 FinanceReactNative 使用React Native做的金融证券股票类App

5 react-native-nw-react-calculator 简洁美观的计算器

6 30-days-of-react-native 30天学React Native的Demo App,结合作者源码,学React Native效果杠杆滴!

7 react-native-sudoku 用React Native写的数独游戏

8 react-weather 精致的天气类App

9 hackerweb-native 简单的新闻类软件

10 react-native-OneLess 使用React Native模仿ONE的App,完成度挺高

11 JueJinClient 仿掘金客户端

12 react-native-cnblogs RN编写的博客园客户端

13 shopping-react-native 一个商城类的RN项目

14 ZhiHuDaily-React-Native 仿知乎日报

15 A-ReactNative-TesterHome 社区咨询类App

16 im.js 一个基于 react-native + mobx + socket.io + node 的仿微信 JS-Wechat

17 House 用react native写的一个html5项目,由于时间关系,完成的比较粗糙,请多多指教,大神勿喷^_^

18 Poplar A social networking application written by React Native

19 HelloRN 适合入门学习的demo,适配android ios, 有网页、图片、音乐、地图等功能

20 elm-react-native RN写的饿了么,还原度相当高,实现了各类动效,高度推荐

21 BIGTIGER.ME 一个使用React Native制作的个人博客客户端,已上架App Store

此处无图
22 RNMars React-Native写的V2EX社区App

23 zqc-app-demo 在球场App,已上线,官网:https://www.zaiqiuchang.com/

24 react-native-quan 一个很简单的RN新闻应用

25 YCool 小说阅读APP

26 SnapChat (VctrySam)仿 SnapChat,国外一哥们VctrySam,用RN仿写了国外几个比较流行的App,后面几个都是他写的

27 Tinder (VctrySam)仿 Tinder,国外的探探

28 AirBnb (VctrySam)仿 Airbnb

29 whatsapp (VctrySam)仿 whatsapp

30 Over18s (VctrySam)仿 Over18s。别问我,我也不知道这是什么软件 此处无图
31 TicTacToe (VctrySam)仿 TicTacToe 此处无图
32 game1 (VctrySam)仿 game1 此处无图
33 hackathon1 (VctrySam)仿 hackathon1

34 do-app (VctrySam)待办事项清单App 此处无图
35 DragonBall (VctrySam)一个游戏

36 Youtube (VctrySam)仿 Youtube

37 Twitter (VctrySam)仿 Twitter

38 FCBarca (VctrySam)仿 FCBarca

39 Slacker (VctrySam)仿 Slacker

40 react-conf-app React Conf 2017 Companion App

41 Mister-Poster 用到了 RN+Redux+Redux Storage+Firebase 的一个开源项目

42 surmon.me.native 一个非常适合入门学习的react-native项目,有借鉴自其他种子项目的组织方式,代码清晰、结构合理。