@@ -82,10 +82,68 @@ apply 到 View 上获得 React Component 一枚
82
82
let Mult = XMult .apply (View)
83
83
```
84
84
85
- 完整代码: https://www.webpackbin.com/bins/-KoGxSJ-3pOi4DicUvaq
85
+ 完整代码: < https://www.webpackbin.com/bins/-KoGxSJ-3pOi4DicUvaq >
86
86
87
87
<iframe src =" https://www.webpackbin.com/bins/-KoGxSJ-3pOi4DicUvaq " frameborder =" 0 " width =" 100% " height =" 500 " ></iframe >
88
88
89
+ ## Functor
90
+
91
+ 想象一下以前构造出来的 ReactComponent, 一旦构造出来就不好修改或重用, 比如还是前面的例子, 你有一个 Mult 控件, 做的是乘法.
92
+
93
+ 那么如果我需要一个新的控件, 而且控件的也需要 ` a * b ` , 但是不同的是, 我们新控件的公式是 ` (a * b)^2 ` . 要是修改函数我们思路很清晰, 构造个新函数呗:
94
+ ``` js
95
+ function mmp (a , b ) {
96
+ return mult (mult (a, b), mult (a, b))
97
+ }
98
+ ```
99
+
100
+ 如果是 React, 那就构造个 HoC 把 Mult 控件套进去呗.
101
+
102
+ 但是不管是包函数还是包 React 控件, 都不是一个可持续组合的方式, 而且构造新的 React Class 又会需要很多啰嗦的模板代码, 如果你经常写 React 你知道我在说什么.
103
+
104
+ Functor 可以免去这些复杂的过程, 而且提供了高可重用与组合的可能.
105
+
106
+ 接着 ` XMult ` , 我们很容易能将其变换成 ` XMMP `
107
+
108
+ ``` js
109
+ let XMMP = XMult .map ((s ) => ({output: s .output * s .output }))
110
+ ```
111
+
112
+ 这样我们就轻松从 XMult 生成一个新的 FantasyX, 在之前的基础上平方一下.
113
+
114
+ 这就像操作数据一样简单 不是吗
115
+
116
+ ``` js
117
+ [1 ,2 ,3 ].map (x => x* x)
118
+ // [2,4,6]
119
+ ```
120
+
121
+ 完整代码: < https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB >
122
+
123
+ <iframe src =" https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB " frameborder =" 0 " width =" 100% " height =" 500 " ></iframe >
124
+
125
+ ## Monoid
126
+
127
+ 有了变换, 我们可能还需要合并两个 FantasyX, 比如上面的 XMMP 和 XMult, 如果我需要一个同时能具有两种行为的 FantasyX
128
+
129
+ ``` js
130
+ let XCOMBINE = XMMP .concat (XMult)
131
+ ```
132
+
133
+ 仅此, 我们就得到了一个同时具有 XMMP 与 XMult 行为的 FantasyX
134
+
135
+ 当然, 因为他们都会修改 ` state.output ` , 合并到一起会导致冲突, 我们稍微修改下 XMMP
136
+
137
+ ``` js
138
+ let XMMP = XMult .map ((s ) => ({output2: s .output * s .output }))
139
+ ```
140
+
141
+ 这样 View 就可以把 XMMP 和 Mult 的输出都显示出来
142
+
143
+ 完整代码: < https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB >
144
+
145
+ <iframe src =" https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB " frameborder =" 0 " width =" 100% " height =" 500 " ></iframe >
146
+
89
147
## Summary
90
148
91
149
使用 FantasyX, 我们很简单将逻辑从 UI 中分离
0 commit comments