@@ -135,11 +135,13 @@ Web Audio Api 学习资料:
135
135
## 4、开发中的经验梳理,以及如何把 React 项目重构为 Vue 版本
136
136
Vue 版本和 React 版本核心代码基本相同,但在编写组件的时候遇到了几个问题,比如:
137
137
138
- 1 . React 版的 store 使用了 immutable 结构的数据,vuex 上的 store 如果使用了 immutable 结构,不利用监听数据变化,故把store 的数据全部使用了普通的数据,在需要这些数据的地方通过 immutable 提供的 ` fromJS ` 转换,在需要普通数据的地方再通过 immutable 的 ` toJS ` 转换成普通数据,在实际重构过程中,我尽量避开了核心游戏实现逻辑,实际上我是在没弄懂游戏实现逻辑的情况下完成重构的,只是保证了输入和输出的一致性
138
+ 1 . React 版的 store 使用了 immutable 结构的数据,vuex 上的 store 如果使用了 immutable 结构,不利用监听数据变化,故把store 的数据全部使用了普通的数据,在需要这些数据的地方通过 immutable 提供的 ` fromJS ` 转换,在需要普通数据的地方再通过 immutable 的 ` toJS ` 转换成普通数据,在实际重构过程中,我尽量避开了核心游戏实现逻辑,实际上我是在没弄懂游戏实现逻辑的情况下完成重构的,只是保证了方法的输入和输出的一致性,要做的只是耐心
139
139
140
- 2 . 如何把 React 组件改写成 Vue 的,我的思路是把组件当成函数,保证一个输入(props)能得到一个确定的输出(view),然后对不同方法也是做同样处理, React 的 setState 会触发 render 方法,所以可以在 methods自定义 render 方法再在 state 变化后手动触发 render 方法
140
+ 2 . 如何把 React 组件改写成 Vue 的,我的思路是把组件当成函数,保证一个输入(props)能得到一个确定的输出(view),然后对不同方法也是做同样处理, React 的 setState 会触发 render 方法,所以可以在 methods 自定义 render 方法再在 state 变化后手动触发 render 方法
141
141
142
- 3 . Vue 没有 React 的` componentWillReceiveProps ` 的生命周期,我的解决方法是使用 watch 配合 ` deep:true ` 来监听 props 的变化,如:
142
+ 3 . 生命周期,简单来说, React 的 ` componentWillMount ` 对应 Vue 的 ` beforeMount ` , React 的 ` componentDidMount ` 对应 Vue 的 ` mounted ` ,React 的用来优化性能的 ` shouldComponentUpdate ` 在 Vue 里并不需要,不需要手动优化这也是我喜欢 Vue 的一点
143
+
144
+ 4 . Vue 没有 React 的` componentWillReceiveProps ` 的生命周期,我的解决方法是使用 watch 配合 ` deep:true ` 来监听 props 的变化,如:
143
145
``` js
144
146
watch: {
145
147
$props: {
@@ -151,10 +153,10 @@ Vue 版本和 React 版本核心代码基本相同,但在编写组件的时候
151
153
}
152
154
```
153
155
154
- 4 . 在必要时候使用 jsx,在这个项目中` matrix 组件 ` 的功能逻辑较复杂,使用 ` template ` 模版来渲染组件已经不合适了, React 每次 setState 会触发 render 方法,所以我们可以在 methods自定义 render 方法再在 state 变化后手动触发 render 方法,但是这个方法对有复杂逻辑的组件来说会变得很繁琐,我的解决方法是通过 Vue 的 jsx 转换插件[ babel-plugin-transform-vue-jsx] ( https://github.com/vuejs/babel-plugin-transform-vue-jsx ) 来使用 jsx 语法对页面进行渲染,当 props 或 state 变化了自动触发 render 方法,另外要注意的是 vue 的 jsx 和 React 的 jsx 书写上有一点的差异
156
+ 5 . 在必要时候使用 jsx,是的, vue 支持 jsx, 在这个项目中` matrix 组件 ` 的功能逻辑较复杂,使用 ` template ` 模版来渲染组件已经不合适了, React 每次 setState 会触发 render 方法,所以我们可以在 methods自定义 render 方法再在 state 变化后手动触发 render 方法,但是这个方法对有复杂逻辑的组件来说会变得很繁琐,我的解决方法是通过 Vue 的 jsx 转换插件[ babel-plugin-transform-vue-jsx] ( https://github.com/vuejs/babel-plugin-transform-vue-jsx ) 来使用 jsx 语法对页面进行渲染,当 props 或 state 变化了自动触发 render 方法,另外要注意的是 vue 的 jsx 和 React 的 jsx 书写上有一点的差异, 当 render 方法存在时,template 语法会失效
155
157
156
158
## 5、架构差异
157
- Redux 的数据流向是 把 store 的状态转化为 props 注入到 根组件,根组件再把这些 props 传入不同组件,当 store 的状态变化,根组件会重新 render, 更新子组件上的 props,子组件再 根据新 props重新 render
159
+ Redux 的数据流向是通过 ` mapStateToProps ` 把 store 的状态转化为 props 然后通过 ` connect ` 函数注入到 根组件,根组件再把这些 props 传入不同组件,当 store 的状态变化,根组件会重新 render, 更新子组件上的 props,子组件再 根据新 props重新 render
158
160
引用知乎一个答友的回答[ https://www.zhihu.com/question/47686258 ] ( https://www.zhihu.com/question/47686258 ) 来说就是:
159
161
>单例store的数据在react中可以通过view组件的属性(props)不断由父模块**“单向”**传递给子模块,形成一个树状分流结构。如果我们把redux比作整个应用的“心肺” (redux的flux功能像心脏,reducer功能像肺部毛细血管),那么这个过程可以比作心脏(store)将氧分子(数据)通过动脉毛细血管(props)送到各个器官组织(view组件)末端的view组件,又可以通过flux机制,将携带交互意图信息的action反馈给store。这个过程有点像将携带代谢产物的“红细胞”(action)通过静脉毛细血管又泵回心脏(store)action流回到store以后,action以参数的形式又被分流到各个具体的reducer组件中,这些reducer同样构成一个树状的hierarchy。这个过程像静脉血中的红细胞(action)被运输到肺部毛细血管(reducer组件)接收到action后,各个child reducer以返回值的形式,将最新的state返回给parent reducer,最终确保整个单例store的所有数据是最新的。这个过程可以比作肺部毛细血管的血液充氧后,又被重新泵回了心脏回到步骤1
160
162
@@ -166,7 +168,7 @@ computed: {
166
168
}
167
169
}
168
170
```
169
- 只要 store 上的数据变了,组件都会自动重新渲染
171
+ 调用 store.commit 提交 payload修改数据 或者 store.dispatch 提交 mutation 间接修改 store 上的数据, commit 和 dispatch 的区别在于 commit 用于同步修改状态, dispatch 用于异步修改状态,异步完成需要再调用 commit,一般简单的需求只需要 commit 一个 payload 就行, 只要 store 上的数据变了,组件都会自动重新渲染
170
172
171
173
## 6、开发
172
174
### 安装
@@ -178,8 +180,10 @@ npm install
178
180
npm run dev
179
181
```
180
182
浏览自动打开 [ localhost:8080] ( localhost:8080 )
183
+
181
184
### 多语言
182
185
在 [ i18n.json] ( https://github.com/Binaryify/vue-tetris/blob/master/src/i18n.json ) 配置多语言环境,使用"lan"参数匹配语言如:` https://Binaryify.github.io/vue-tetris/?lan=en `
186
+
183
187
### 打包编译
184
188
```
185
189
npm run build
0 commit comments