react技术栈学习

  公司后面的项目会用到react,这段时间从头学习react技术栈,给自己的规划是react => react router => react redux => react native,目前刚接触到redux,看的人一脸懵逼,很是憔悴。来博客园写写博客,散散心,记录一下这段时间的学习。

  目前react版本 15.4.2,根据切身体验,首先,通读一遍react英文官网教程,读到form表单那里即可,需要理解80%以上内容,并且读懂每一个demo。看完这些,对react思想会有一个基本了解。

  然后,学习w3cplus上这个教程,这个教程相当棒,可以看出作者融合了很多自己的想法,而且讲了很多小技巧,也是对官网教程的一个补充。这个教程也相对简单,因此极力推荐将里面的所有demo重写一遍。教程上还是用createClass创建组件,重写时可以用官网推荐的es6写法。我已将所有demo用es6重写,见github

  看完以上,这个用react写的组件就很容易掌握了 react入门实例

  w3cplus上的教程后面对react router有一个大概的介绍,不过网上对react router相关的教程比较老,因此,这里推荐通过官方最新教程学习,见github

  学到这,我犹豫写几个demo巩固一下之前所学,还是接着学redux。老板说,应该对整个技术栈有一个大概了解,这样遇到具体项目就知道从何入手,再逐一攻破。抛开native,我决定至少先了解下redux。。。。。第一次接触redux这种思想,看了半天,这到底是什么玩意?!

  不过再难还得学啊,刚刚看到好多相关项目都引进了webpack,不禁有些感想,曾经学nodejs时想了解下webpack,看半天没明白,感觉特别反人类,就放弃了。而如果用react做项目,webpack是必须要了解的,等到后面用时再看,不如现在就学,哪怕学不会到时也多些理解,多看看多想想总能学会的。无奈团队刚起步,目前就我一个半吊子技术,后期估计前端也只有我负责,只能自己上。看官网教程,看别人项目,终于搞懂了常用配置参数,原来也就那么回事。后面的自动刷新配置耽误了些时间,但也总算搞定了。eslint也是,又扫清一个拦路虎。

  每次遇到那些感觉好难的技术,一时理解不了的,就想先放放。但转念想,如果现在搞定它,那么从此刻起,我将开始受益,而且学一次,受益终生,多么划算的买卖。不仅如此,下一个技术的起点会在这次攻克难关的成果之上,水涨船高,我的视野会越来越宽阔,能力提高得也越来越快。那么,何不再坚持一下? 等到问题被解决,会发现,并没有自己想象中那么难,这便是一个书越读越薄的过程。

  这次的redux也是,全新的思想挑战着自己,何不再努力下,离成功更进一步?

// ================= 3月21日更新 ==================

  前面废话较多。

  到今天从接触react整整一个月了,因为公司没项目一直处在学习的过程中。react整个技术栈大概都了解到了,从学习redux开始慢慢有些怀疑人生。不要被它的名字欺骗,其实redux跟react基本没有关系,它可以算是一种开发思想,用了redux你就得按它的套路来组织代码,而且不仅仅能够使用在react上,比如angular就可以使用redux,甚至小程序也可以。之前只接触过浅薄的MVC模式,这次学redux相当痛苦,store、action、reduce这些词看起来很简单,但是用起来一点也不善良。学redux没有捷径,就是不断地看资料、理解,看资料,一遍不行看两遍,两遍不行接着看。我连续看了一周才逐渐理解了它几个部分之间合作的关系,所以,如果看了两三天还是郁闷不要气馁。在这里,不详细介绍redux是怎么回事,分享一下我踩过的坑。

  1,再次声明,redux跟react没有关系。在react项目中引入redux可以使用官方的轮子 react-redux ,它提供两个主要功能,connect()和<Provider />,前者需要着重理解,是这个轮子的核心。不用这个这个轮子也能在react项目中使用redux,这时需要手动dispatch一个action,触发视图更新。

  2,如同1所说,有些资料中没有说明讲得是redux还是react-redux(如果没有提到react,就要注意最好不要跟react产生联系),你会发现有时候它用dispatch一个action触发UI更新;有时候它没有用dispatch;有时候它引入了react-redux这个库,也用了connect()这个方法,但最后还是用到了dispatch。初学时很容易分不清这些概念,再次提醒。

  3,reducer不是一个内置接口,只是(prevState, action) => (newState)这种形式的表示。

  4,用了redux,你会发现还需要更多的轮子来完成一个项目,异步就是其中一种。关于redux中的action异步,以前用redux-thunk,现在建议使用redux-saga,一个简易的saga例子在这里

  5,redux思想了解清楚后可能会有“你说得我都懂,但写项目时就是不知从何下手”这种尴尬。我思考良久,这是缺少既往的项目开发经验原因(这不废话( ╯□╰ ))。redux终究是一门架构,考虑的是如何设计出一个结构清晰的Application,所以,如果你还未开始reudux,建议不要轻易过早涉及它,去学react-native吧,一门更深的坑,但至少深入锻炼了写react代码的能力,等将来项目复杂到无法继续用react自身优化再来考虑redux吧。

分享一些优秀的网站,可按次序来读

  1,https://dudu.zhihu.com/story/7997429 浅显易懂的入门介绍

  2,http://cn.redux.js.org/ 官方中文文档,多读几遍,注意redux和react-redux的区别。第2、3章的示例可以详细了解下

  3,https://segmentfault.com/a/1190000004355491?_ea=661485 这里用的react-redux

  4,https://github.com/joeyguo/blog/issues/3 

  5,http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html 阮老师的三篇,其实刚开始看时没看懂,了解了action、reducer这些再看比较好

  6,https://github.com/react-guide/redux-tutorial-cn 

  7,http://www.cnblogs.com/lewis617/p/5145073.html 讲connect的

  8,https://yq.aliyun.com/articles/59428 还是connect

  9,http://www.cnblogs.com/hhhyaaon/p/5863408.html connect

  10,https://leozdgao.me/reacthe-reduxde-qiao-jie-react-redux/ 在你分得清redux和react-redux后,会极其想了解他们的区别

  11,https://github.com/jasonslyvia/a-cartoon-intro-to-redux-cn

  12,http://www.imooc.com/u/4725764/articles 推荐细读,我看了受益匪浅

  13,https://www.w3ctech.com/topic/1561

  14,https://github.com/kenberkeley/redux-simple-tutorial 这个讲了源码

  另分享一个讲container和component的:http://www.jianshu.com/p/6fa2b21f5df3

  没错,我看了这么多资料,仍然无法拿下redux。这货不是API调用那么简单,到一定程度,你还会研究中间件,函数式编程,书都给你备好了:https://www.gitbook.com/book/llh911001/mostly-adequate-guide-chinese/details

  再难也得上啊,人生就是一次又一次的破而后立,不断地挑战自己。

  最近研究react-native,之前觉得学了react,写native易如反掌,结果还是太太年轻。用的react思想不假,但是这里面没有自定义组件,它只是抽象了几个具有代表性的原生应用组件,比如列表、文字、按钮之类的,是不是觉得很简单?呵呵。地图咋办?据我了解,目前没有一家地图提供商适配react-native版的接口,现存的一些还是民间的奇能异士费心研究的,但是react-native还没有一个稳定版本,一年前的轮子现在已经用不了了。所以,如果想写一个优秀的react-native APP,如果需求略复杂,就需要封装现有的原生组件功能,这就要了解Android和IOS开发。

  react-native还在飞速发展,我们应给予足够的关注和鼓励,这样在不久的将来,才会真正出现一个一次编写,到处运行的全能开发平台。react目前已经能写vr,是不是很激动。

  相信react,相信JavaScript,相信自己。

react-native踩坑记,不定期更新

tips:
1,图片的引用参数应始终为字符串,网络图片要指定尺寸
2,长列表View组件封装的视图无法滚动,用ScrollView
  ScrollView一次渲染所有内容,ListView优先渲染视口内容
3,navigator必须置于最外层?(initialRoute、renderScene)renderScene在每次导航调研都会渲染
  http://bbs.reactnative.cn/topic/20/%E6%96%B0%E6%89%8B%E7%90%86%E8%A7%A3navigator%E7%9A%84%E6%95%99%E7%A8%8B

  目前官方已不再维护navigator这个组件,推荐使用react-navigation,redux架构,可不止使用在native端

4,容器元素添加flexDirection才能让子元素flex
5,触摸点击用TouchableHighlight,属性onPress
6,报错时注意项目名是否与文件名一致
7,TextInput获取组件的输入值需要调用event.nativeEvent.text
8,margin包含在flex大小内
9,文本只用Text组件
10,按钮、链接等有交互的动作用TouchableHighlight组件
11,将Image至于View组件外层作为背景图
12,justifyContent和alignItems均写在父元素作用于子元素
  justifyContent与主轴平行,后者与主轴垂直
13,获取数据要放在componentDidMount中
14,React必须import进去
15,项目引用的文件夹改名后必须重启服务
16,source引用的网络图片需要指定大小才会显示
17,启动项目时出现诸如could not delete path…的错误可尝试在android目录下执行gradlew.bat clean(Widnows),然后再run android
18,Button组件由TouchableHighlight和Text包装,所以既能显示文字,又能点击
19,WebView: http://www.jianshu.com/p/b37ee000379e#
20,ToastAndroid,底部那个小黑显示条
21,Switch的onValueChange调用时默认传递当前组件的布尔值
22,在在android/app/proguard-rules.pro尾部添加混淆规则
23,本地浏览器、邮箱等应用打开:Link
24,textinput 去掉安卓下划线:underlineColorAndroid='transparent'
25,父组件的props置为子组件state时,父组件setState不会刷新子组件UI
26,组件通讯:RCTDeviceEventEmitter  http://www.jianshu.com/p/5fe3e0f91ce5
27,ios下可以使用react-native-maps,默认高德地图。安卓,呵呵
28,expected a component class, got [object Object] error 导出的组件名首字母大写

常用轮子:
新建项目:create-react-native-app
  http://www.cnblogs.com/shaoting/p/6136447.html
  https://github.com/MarnoDev/react-native-open-project
  http://www.jianshu.com/p/53ff78168acc
首屏进入前的loading画面: SplashScreen
图标:react-native-vector-icons/Ionicons
底部切换栏:react-native-tab-navigator,不可滑动
顶部标签切换栏(也可渲染到底部,可滑动):react-native-scrollable-tab-view
  http://www.jianshu.com/p/b7788c3d106e
本地持久存储: https://github.com/sunnylqm/react-native-storage
单图上传:react-native-image-picker
多图上传带裁剪:react-native-image-crop-picker
视频:react-native-video
首屏前图片:react-native-splash-screen
轮播:react-native-swiper
文件操作:react-native-fs
图标:react-native-charts-wrapper
  http://www.jianshu.com/p/432517c5b531
滑动选项:react-native-swipe-list-view
可自定义的toast:react-native-easy-toast
很漂亮的底部标签切换:react-native-material-bottom-navigation
列表拖拽排序:react-native-sortable-list

编译的坑
1,要装yarn
2,注意AndroidManifest.xml里的格式写法
  meta-data位于application内;
  user-permission位于manifest下,且不可重复
3,写在Android根目录下的gradle.properties,不用新建
4,MainApplication.java里asList的多余逗号
5,删除之前的应用
6,can't delete path && can't create => 删除build下的目录
7,import引用的方法要不要带花括号

style的几种写法
普通写法:
  style={{fontSize: 12}}
建议写法:
  style={styles.fontSize12}
集合写法:
  style={[styles.fontSize12], [styles.font_color],{fontWeight: 'bold'}}
条件写法:
  style={index===0 ? styles.index0 : styles.index_other}
  style={[ styles.button, this.state.touching && styles.highlight ]}

ios启用http例外

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>localhost</key>
            <dict>
                <key>NSTemporaryExceptionAllowsInsecureHTTPSLoads</key>
                <false/>            
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>1.0</string>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict> 

其它

gradle下载失败解决办法
http://www.cnblogs.com/yahue/p/React_Native_Android_gradle.html

native 入门
https://juejin.im/post/5898388b128fe1006cb943e3

很多优秀的资料
https://juejin.im/tag/React%20Native

组件库
https://js.coach/

入门指南
https://github.com/vczero/react-native-lesson

csdn下载区

集成百度地图
http://www.dswey.com/2016/07/29/react-native-baidu-map/

掘金客户端
https://github.com/wangdicoder/JueJinClient

组件间通信RCTDeviceEventEmitter
http://www.tuicool.com/articles/uAnYvy

江清清的技术专栏
http://www.lcode.org

国内资源
https://applean.cn/gist/8

支付、日期等
http://jafeney.com/archives/
http://blog.csdn.net/u011413061/article/details/53183370

安卓dev tool
http://www.androiddevtools.cn/

// ==================== 写在最后,6月3日

  博客园编辑器太老了不好用。欢迎关注我的简书,我在那边活跃些

原文地址:https://www.cnblogs.com/ruoji/p/6464131.html