React Native开发程序员React.js

极速开发 React — Reason 2

2019-03-15  本文已影响63人  zidea
Speed_Racer_promotional_image.jpg

现在是速度至上的时代,我们必须以一敌百。才能立于不败之地。

FCJG300-0043.jpg
面对越来越复杂的业务逻辑,我们只能全速向前冲,这一切都需要有技术作为保障。所以我们需要选择一个能够实现快速开发的技术。
th.jpg
reason react 网址
个人选择并且推荐使用 reason 来开发
极速开发 React — Reason 1 rr_001.JPG

搭建项目

npm install -g bs-platform
bsb -init my-react-app -theme react
cd my-react-app && npm install && npm start
npm run webpack

创建 index.html

我们将架构默认的工程文件都删除,自己来写一个列表的 demo。先创建一个 index.html。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Zidea ReasonReact Examples</title>
</head>
<body>
  <div id="app"></div>
  <script src="Index.js"></script>
</body>
</html>

然后创建 re 结尾的 reason 文件

ReactDOMRe.renderToElementWithId(<TutListComponent />, "app");

我们这里可能需要使用 bs-json 和 bs-fetch,我们可以用 npm 来安装一下这两个库,或者说是 reason 的模块。然后需要 bsconfig 文件添加依赖,这样我们就可以在工程中使用这两模块。

 "bs-dependencies": [
    "reason-react",
    "@glennsl/bs-json",
    "bs-fetch"
  ],

我这里用 python flask 写了一个服务,返回值为


rr_002.JPG
type tut = {title:string, body:string}

我们这里根据官网的 demo 就先简单地定义为 string

type tut = string;
  1. statelessComponent
  2. reducerComponent
    这里我们创建 reducerComponent 类型组件
type state = 
    | Loading
    | Loaded(array(tut))
    | Error;
module Decode = {
    let tuts = json: array(string) =>
        Json.Decode.(
            json |> field("messages",array(string)) |> Array.map(_, tut => tut)
        )
}


- **make**
是让我们在编译时生产 component 的方法。

 initialState: _state => Loading,

然后就是 reducer 这纯函数,最近然后 mvi 模式,再次开始研究 reducer,reduce 我还是在学习 redux + react + rxjs 时学习过,为了理解也花费不少精力。这里简单介绍一下,毕竟 reduce 不是我们今天的重点。reduce 是一个纯函数,接受 action(动作)返回一个新的 state。然后我们 reducer 中根据 action 进行分支更新我们状态。这里我发现没有用引入 redux 却做了 redux 事情,代码表意也挺好,给 reason 一个赞。

Js.Promise.(
                            Fetch.fetch("http://localhost:4600/get_tuts")
                            |> then_(Fetch.Response.json)
                            |> then_(json =>
                                json
                                |> Decode.tuts
                                |> (tuts => self.send(TutsFetched(tuts)))
                                |> resolve
                            )
                            |> catch(_err => 
                                    Js.Promise.resolve(self.send(TutsFailedToFetch))
                                )
                            |> ignore
                        )
type tut = string;

type state = 
    | Loading
    | Loaded(array(tut))
    | Error;
type action = 
    | TutsFetch
    | TutsFetched(array(tut))
    | TutsFailedToFetch;

module Decode = {
    let tuts = json: array(string) =>
        Json.Decode.(
            json |> field("messages",array(string)) |> Array.map(_, tut => tut)
        )
}



let component = ReasonReact.reducerComponent("TutListComponent");

let make = _children => {
    ...component,
    initialState: _state => Loading,
    reducer: (action, _state) =>
        switch (action) {
        | TutsFetch => 
            ReasonReact.UpdateWithSideEffects(
                Loading,
                (
                    self =>
                        Js.Promise.(
                            Fetch.fetch("http://localhost:4600/get_tuts")
                            |> then_(Fetch.Response.json)
                            |> then_(json =>
                                json
                                |> Decode.tuts
                                |> (tuts => self.send(TutsFetched(tuts)))
                                |> resolve
                            )
                            |> catch(_err => 
                                    Js.Promise.resolve(self.send(TutsFailedToFetch))
                                )
                            |> ignore
                        )
                ),
            )
        | TutsFetched(tuts) => ReasonReact.Update(Loaded(tuts))
        | TutsFailedToFetch => ReasonReact.Update(Error)
    },
    didMount: self => self.send(TutsFetch),
    render: self =>
    switch (self.state) {
    | Error => <div> (ReasonReact.string("An error occurred!")) </div>
    | Loading => <div> (ReasonReact.string("Loading...")) </div>
    | Loaded(tuts) =>
      <div>
        <h1> (ReasonReact.string("tuts")) </h1>
        <p> (ReasonReact.string("Source: ")) </p>
        <a href=""></a>
        <ul>
          (
            Array.map(tuts, tut =>
              <li key=tut> (ReasonReact.string(tut)) </li>
            )
            |> ReasonReact.array
          )
        </ul>
      </div>
    },
};
上一篇下一篇

猜你喜欢

热点阅读