不懂函数式?用mobx来写react应用吧
目的直接了当吧:其实这篇就是想安利大家一个新的状态管理库。如果你使用react,更熟悉面向对象,羡慕vue的简单直观,对redux感觉有些烦躁,真心安利你,体验下 安利的同时,略带些内容。内容走起 内容因为看到
大神主动推荐自己成名作品的替代品?!!! 于是立马尝试。不到一个下午的时间,基本上手,然后晚上回去想了想代码组织的问题,试用了起来。发现开发效率大幅提升,而且整个工程的脉络很清楚。 然后回想起当初学redux,真感觉自己智商不够。看了一周文档,理念理解的七七八八,不知道如何写代码;然后因为源码不多,又看了一周redux的源码,还发现了个bug,提了pr,但是依旧不知道如何写代码。。最后只能硬着头皮无脑抄别人的代码,才大致明白了整个流程。 所以从自身实际情况的对比,有段时间略傻x的变成了redux无脑黑,并在很多场合说过,谁用redux谁加班。。。现在想想too simple 经过不断的讨论,觉得使用redux不爽,最大的原因是不熟悉函数式,而且js本身也没有在语法上为函数式提供什么便利。 redux更像是定了一种规范,然后为了能把这种规范应用到工程中,提供了几个帮助函数。如果对函数式很熟悉,那么会非常认同这套并很舒服的使用起来。 但是,熟悉函数式的工程师数量远比熟悉面向对象的少,我对函数式也就只了解个皮毛。。 言归正传,来看看 使用mobx的写react,大体上,步骤分为两步:
import $ from 'jquery' // just for ajax usage import { observable } from 'mobx' class Posts{ @observable list=[] //这里为了演示,直接$.ajax。 //但是这样的model,很难测试!! fetchPosts(){ $.ajax({ url:'/posts' }).done((data)=>{ this.list = data.postList }) } } 这个对于熟悉OOP的人,亲切的不行,写model类这事,有点经验的工程师,没写个上千个,也写个几百个吧。异步的处理,也很直白,请求,然后根据请求的数据,处理相应的属性。这段代码,如果不引入es6的语法,和以前jquery时代,写model没啥区别。 这里多了个 当然
大家注意两点
应用的状态是本源,其他的部分,都应该从本源导出(derived)。比如上面的Posts类,本源就是 //写在 class Posts里 autorun(()=>console.log(this.list.length)) autorun里的匿名函数对list进行了取值, 使用react后,ui的变化也是状态变化后,产生的副作用。所以很自然 autorun(()=> redner(this.list)) 那么状态的变化,就引起ui的变化,而且仅当 2.写react组件 有了上面的 import React from 'react' import { observer } from 'mobx-react' import Posts from './Posts' @observer class PostListComp extends React.component { contructor() { this.posts = new Posts(); this.posts.fetchPosts() } render() { return ( <ul> {this.posts.list.map((post)=>( <li key={post.id}>post.title</li> ))} </ul> ) } } 这里 这里的状态是 如果 const profileView = observer(props => { if (props.person.nickName) return <div>{props.person.nickName}</div> else return <div>{props.person.fullName}</div> }); 如果nickName不为空,那么mobx知道,这个view只依赖于nickName,fullName的变动不会引起view的变化,从而不会从新render组件。 其他的api
还有一些,大家去读文档吧。 题外话model改变,ui自动变化,mobx写着,让我很有vue的感觉。感觉就是多了几个 缺点社区还不够丰富。mobx的资料还不多,基本没有中文资料。我安利的同学,都反映官方的get start(英文)看着有点蛋疼。然后我说,想想你们写redux的第一个demo,然后他们表示刚才的疼不算什么~。 相信大家手上已经有些项目用redux了,如果用着也算顺手,其实也就没必要换了。我本人也同时维护着使用redux的项目,然后在新项目里使用mobx,我的效率是大幅提升的,但是老项目重写的代价太大。。。 结论所以,如果你使用react,更熟悉面向对象,羡慕vue的简单直观,真心安利你,体验下mobx。写的很舒爽,而且程序的性能有保证。对了官方还提供了一个dev-tools,非常不错,能够直接看到哪些组件被重渲染了。 如果你被安利成功,想看看mobx,建议从官方文档开始,或者去官方的推荐列表里,找找视频教程(不要想,肯定是英文的),地址是 http://mobxjs.github.io/mobx/faq/blogs.html 官方还提供了一个starter,可以省去各种配置。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |