|
12 | 12 | ### 目录
|
13 | 13 | <!-- TOC -->
|
14 | 14 | | 序号. | 问题 |
|
15 |
| -| --- | --------- | |
| 15 | +| --- | --------- | |
16 | 16 | | | [Core React](#core-react) |
|
17 | 17 | |1 | [什么是 React?](#什么是-react) |
|
18 | 18 | |2 | [React 的主要特点是什么?](#react-的主要特点是什么) |
|
|
148 | 148 | |131 | [在 React Router v4 中的`<Router>`组件是什么?](#在-react-router-v4-中的router组件是什么) |
|
149 | 149 | |132 | [`history` 中的 `push()` 和 `replace()` 方法的目的是什么?](#history-中的-push-和-replace-方法的目的是什么) |
|
150 | 150 | |133 | [如何使用在 React Router v4 中以编程的方式进行导航?](#如何使用在-react-router-v4-中以编程的方式进行导航) |
|
151 |
| -|134 | [如何在React Router v4中获取查询字符串参数?](#如何在react-router-v4中获取查询字符串参数) | |
152 |
| -|135 | [为什么你会得到"Router may have only one child element"警告?](#为什么你会得到"router-may-have-only-one-child-element"警告) | |
| 151 | +|134 | [如何在 React Router v4 中获取查询字符串参数?](#如何在-react-router-v4-中获取查询字符串参数) | |
| 152 | +|135 | [为什么你会得到 "Router may have only one child element" 警告?](#为什么你会得到-"router-may-have-only-one-child-element"-警告) | |
153 | 153 | |136 | [如何在 React Router v4 中将 params 传递给 `history.push` 方法?](#如何在-react-router-v4-中将-params-传递给-history.push-方法) |
|
154 | 154 | |137 | [如何实现默认页面或 404 页面?](#如何实现默认页面或-404-页面) |
|
155 | 155 | |138 | [如何在 React Router v4 上获取历史对象?](#如何在-react-router-v4-上获取历史对象) |
|
|
169 | 169 | |150 | [Jest 对比 Jasmine 有什么优势?](#jest-对比-jasmine-有什么优势) |
|
170 | 170 | |151 | [举一个简单的 Jest 测试用例](#举一个简单的-jest-测试用例) |
|
171 | 171 | | | [React Redux](#react-redux) |
|
172 |
| -|152 | [什么是 flux?](#什么是-flux) | |
| 172 | +|152 | [什么是 Flux?](#什么是-flux) | |
173 | 173 | |153 | [什么是 Redux?](#什么是-redux) |
|
174 | 174 | |154 | [Redux 的核心原则是什么??](#redux-的核心原则是什么) |
|
175 | 175 | |155 | [与 Flux 相比,Redux 的缺点是什么?](#与-flux-相比redux-的缺点是什么) |
|
176 |
| -|156 | [`mapStateToProps()`和`mapDispatchToProps()`之间有什么区别?](#mapstatetoprops和mapdispatchtoprops之间有什么区别) | |
| 176 | +|156 | [`mapStateToProps()` 和 `mapDispatchToProps()` 之间有什么区别?](#mapstatetoprops-和-mapdispatchtoprops-之间有什么区别) | |
177 | 177 | |157 | [我可以在 reducer 中触发一个 Action 吗?](#我可以在-reducer-中触发一个-action-吗) |
|
178 | 178 | |158 | [如何在组件外部访问 Redux 存储的对象?](#如何在组件外部访问-redux-存储的对象) |
|
179 | 179 | |159 | [MVW 模式的缺点是什么?](#mvw-模式的缺点是什么) |
|
|
185 | 185 | |165 | [React 上下文和 React Redux 之间有什么区别?](#react-上下文和-react-redux-之间有什么区别) |
|
186 | 186 | |166 | [为什么 Redux 状态函数称为 reducers ?](#为什么-redux-状态函数称为-reducers-) |
|
187 | 187 | |167 | [如何在 Redux 中发起 AJAX 请求?](#如何在-redux-中发起-ajax-请求) |
|
188 |
| -|168 | [我应该在Redux Store 中保留所有组件的状态吗?](#我应该在redux-store-中保留所有组件的状态吗) | |
| 188 | +|168 | [我应该在 Redux Store 中保留所有组件的状态吗?](#我应该在-redux-store-中保留所有组件的状态吗) | |
189 | 189 | |169 | [访问 Redux Store 的正确方法是什么?](#访问-redux-store-的正确方法是什么) |
|
190 | 190 | |170 | [React Redux 中展示组件和容器组件之间的区别是什么?](#react-redux-中展示组件和容器组件之间的区别是什么) |
|
191 |
| -|171 | [Redux中常量的用途是什么?](#redux中常量的用途是什么) | |
192 |
| -|172 | [编写`mapDispatchToProps()`有哪些不同的方法?](#编写mapdispatchtoprops有哪些不同的方法) | |
193 |
| -|173 | [在`mapStateToProps()`和`mapDispatchToProps()`中使用`ownProps`参数有什么用?](#在mapstatetoprops和mapdispatchtoprops中使用ownprops参数有什么用) | |
| 191 | +|171 | [Redux 中常量的用途是什么?](#redux-中常量的用途是什么) | |
| 192 | +|172 | [编写 `mapDispatchToProps()` 有哪些不同的方法?](#编写-mapdispatchtoprops-有哪些不同的方法) | |
| 193 | +|173 | [在 `mapStateToProps()` 和 `mapDispatchToProps()` 中使用 `ownProps` 参数有什么用?](#在-mapstatetoprops-和-mapdispatchtoprops-中使用-ownprops-参数有什么用) | |
194 | 194 | |174 | [如何构建 Redux 项目目录?](#如何构建-redux-项目目录) |
|
195 | 195 | |175 | [什么是 redux-saga?](#什么是-redux-saga) |
|
196 | 196 | |176 | [redux-saga 的模型概念是什么?](#redux-saga-的模型概念是什么) |
|
197 |
| -|177 | [在 redux-saga 中`call()`和`put()`之间有什么区别??](#在-redux-saga-中call和put之间有什么区别) | |
| 197 | +|177 | [在 redux-saga 中 `call()` 和 `put()` 之间有什么区别?](#在-redux-saga-中-call-和-put-之间有什么区别) | |
198 | 198 | |178 | [什么是 Redux Thunk?](#什么是-redux-thunk) |
|
199 |
| -|179 | [`redux-saga`和`redux-thunk`之间有什么区别?](#redux-saga和redux-thunk之间有什么区别) | |
| 199 | +|179 | [`redux-saga` 和 `redux-thunk` 之间有什么区别?](#redux-saga-和-redux-thunk-之间有什么区别) | |
200 | 200 | |180 | [什么是 Redux DevTools?](#什么是-redux-devtools) |
|
201 | 201 | |181 | [Redux DevTools 的功能有哪些?](#redux-devtools-的功能有哪些) |
|
202 | 202 | |182 | [什么是 Redux 选择器以及使用它们的原因?](#什么是-redux-选择器以及使用它们的原因) |
|
203 | 203 | |183 | [什么是 Redux Form?](#什么是-redux-form) |
|
204 | 204 | |184 | [Redux Form 的主要功能有哪些?](#redux-form-的主要功能有哪些) |
|
205 |
| -|185 | [如何向Redux添加多个中间件?](#如何向redux添加多个中间件) | |
| 205 | +|185 | [如何向 Redux 添加多个中间件?](#如何向-redux-添加多个中间件) | |
206 | 206 | |186 | [如何在 Redux 中设置初始状态?](#如何在-redux-中设置初始状态) |
|
207 | 207 | |187 | [Relay 与 Redux 有何不同?](#relay-与-redux-有何不同) |
|
208 | 208 | | | [React Native](#react-native) |
|
|
220 | 220 | |198 | [如何在 React 中使用 Polymer?](#如何在-react-中使用-polymer) |
|
221 | 221 | |199 | [与 Vue.js 相比,React 有哪些优势?](#与-vue.js-相比react-有哪些优势) |
|
222 | 222 | |200 | [React 和 Angular 有什么区别?](#react-和-angular-有什么区别) |
|
223 |
| -|201 | [为什么 Reac t选项卡不会显示在 DevTools 中?](#为什么-reac-t选项卡不会显示在-devtools-中) | |
| 223 | +|201 | [为什么 React 选项卡不会显示在 DevTools 中?](#为什么-react-选项卡不会显示在-devtools-中) | |
224 | 224 | |202 | [什么是 Styled Components?](#什么是-styled-components) |
|
225 | 225 | |203 | [举一个 Styled Components 的例子?](#举一个-styled-components-的例子) |
|
226 | 226 | |204 | [什么是 Relay?](#什么是-relay) |
|
227 |
| -|205 | [如何在`create-react-app`中使用TypeScript?](#如何在create-react-app中使用typescript) | |
| 227 | +|205 | [如何在 `create-react-app` 中使用 TypeScript?](#如何在-create-react-app-中使用-typescript) | |
228 | 228 | | | [Miscellaneous](#miscellaneous) |
|
229 | 229 | |206 | [Reselect 库的主要功能有哪些?](#reselect-库的主要功能有哪些) |
|
230 | 230 | |207 | [举一个 Reselect 用法的例子?](#举一个-reselect-用法的例子) |
|
231 |
| -|208 | [Redux中的 Action 是什么?](#redux中的-action-是什么) | |
| 231 | +|208 | [Redux 中的 Action 是什么?](#redux-中的-action-是什么) | |
232 | 232 | |209 | [在 React 中 statics 对象是否能与 ES6 类一起使用?](#在-react-中-statics-对象是否能与-es6-类一起使用) |
|
233 | 233 | |210 | [Redux 只能与 React 一起使用么?](#redux-只能与-react-一起使用么) |
|
234 | 234 | |211 | [您是否需要使用特定的构建工具来使用 Redux ?](#您是否需要使用特定的构建工具来使用-redux-) |
|
235 |
| -|212 | [Redux Form 的`initialValues`如何从状态更新?](#redux-form-的initialvalues如何从状态更新) | |
| 235 | +|212 | [Redux Form 的 `initialValues` 如何从状态更新?](#redux-form-的-initialvalues-如何从状态更新) | |
236 | 236 | |213 | [React 是如何为一个属性声明不同的类型?](#react-是如何为一个属性声明不同的类型) |
|
237 | 237 | |214 | [我可以导入一个 SVG 文件作为 React 组件么?](#我可以导入一个-svg-文件作为-react-组件么) |
|
238 | 238 | |215 | [为什么不建议使用内联引用回调或函数?](#为什么不建议使用内联引用回调或函数) |
|
|
293 | 293 | |270 | [formik 相对于其他 redux 表单库有什么优势?](#formik-相对于其他-redux-表单库有什么优势) |
|
294 | 294 | |271 | [为什么不需要使用继承?](#为什么不需要使用继承) |
|
295 | 295 | |272 | [我可以在 React 应用程序中可以使用 web components 么?](#我可以在-react-应用程序中可以使用-web-components-么) |
|
296 |
| -|273 | [什么是 dynamic import?](#什么是-dynamic-import) | |
| 296 | +|273 | [什么是动态导入?](#什么是动态导入) | |
297 | 297 | |274 | [什么是 loadable 组件?](#什么是-loadable-组件) |
|
298 | 298 | |275 | [什么是 suspense 组件?](#什么是-suspense-组件) |
|
299 | 299 | |276 | [什么是基于路由的代码拆分?](#什么是基于路由的代码拆分) |
|
|
2683 | 2683 | }
|
2684 | 2684 | ```
|
2685 | 2685 |
|
2686 |
| -134. ### 如何在React Router v4中获取查询字符串参数? |
| 2686 | +134. ### 如何在 React Router v4 中获取查询字符串参数? |
2687 | 2687 |
|
2688 | 2688 | 在 React Router v4 中并没有内置解析查询字符串的能力,因为多年来一直有用户希望支持不同的实现。因此,使用者可以选择他们喜欢的实现方式。建议的方法是使用 [query-string](https://www.npmjs.com/package/query-string) 库。
|
2689 | 2689 |
|
|
2701 | 2701 |
|
2702 | 2702 | 如果使用 `URLSearchParams` 的话您应该为 IE11 使用*polyfill*。
|
2703 | 2703 |
|
2704 |
| -135. ### 为什么你会得到"Router may have only one child element"警告? |
| 2704 | +135. ### 为什么你会得到 "Router may have only one child element" 警告? |
2705 | 2705 |
|
2706 | 2706 | 此警告的意思是`Router`组件下仅能包含一个子节点。
|
2707 | 2707 |
|
|
3022 | 3022 |
|
3023 | 3023 | ## React Redux
|
3024 | 3024 |
|
3025 |
| -152. ### 什么是 flux? |
| 3025 | +152. ### 什么是 Flux? |
3026 | 3026 |
|
3027 |
| - *Flux*是*应用程序设计范例*,用于替代更传统的 MVC 模式。它不是一个框架或库,而是一种新的体系结构,它补充了 React 和单向数据流的概念。在使用 React 时,Facebook 会在内部使用此模式。 |
| 3027 | + *Flux* 是*应用程序设计范例*,用于替代更传统的 MVC 模式。它不是一个框架或库,而是一种新的体系结构,它补充了 React 和单向数据流的概念。在使用 React 时,Facebook 会在内部使用此模式。 |
3028 | 3028 |
|
3029 | 3029 | 在 dispatcher,stores 和视图组件具有如下不同的输入和输出:
|
3030 | 3030 |
|
3031 | 3031 | 
|
3032 | 3032 |
|
3033 | 3033 | 153. ### 什么是 Redux?
|
3034 | 3034 |
|
3035 |
| - *Redux*是基于*Flux设计模式*的 JavaScript 应用程序的可预测状态容器。Redux 可以与 React 一起使用,也可以与任何其他视图库一起使用。它很小(约2kB)并且没有依赖性。 |
| 3035 | + *Redux* 是基于 *Flux设计模式* 的 JavaScript 应用程序的可预测状态容器。Redux 可以与 React 一起使用,也可以与任何其他视图库一起使用。它很小(约2kB)并且没有依赖性。 |
3036 | 3036 |
|
3037 | 3037 | 154. ### Redux 的核心原则是什么??
|
3038 | 3038 |
|
|
3050 | 3050 | 2. **您将不得不仔细选择您的软件包:** 虽然 Flux 明确没有尝试解决诸如撤消/重做,持久性或表单之类的问题,但 Redux 有扩展点,例如中间件和存储增强器,以及它催生了丰富的生态系统。
|
3051 | 3051 | 3. **还没有很好的 Flow 集成:** Flux 目前可以让你做一些非常令人印象深刻的静态类型检查,Redux 还不支持。
|
3052 | 3052 |
|
3053 |
| -156. ### `mapStateToProps()`和`mapDispatchToProps()`之间有什么区别? |
| 3053 | +156. ### `mapStateToProps()` 和 `mapDispatchToProps()` 之间有什么区别? |
3054 | 3054 |
|
3055 | 3055 | `mapStateToProps()`是一个实用方法,它可以帮助您的组件获得最新的状态(由其他一些组件更新):
|
3056 | 3056 |
|
|
3278 | 3278 | }
|
3279 | 3279 | ```
|
3280 | 3280 |
|
3281 |
| -168. ### 我应该在Redux Store 中保留所有组件的状态吗? |
| 3281 | +168. ### 我应该在 Redux Store 中保留所有组件的状态吗? |
3282 | 3282 |
|
3283 | 3283 | 将数据保存在 Redux 存储中,并在组件内部保持 UI 相关状态。
|
3284 | 3284 |
|
|
3325 | 3325 |
|
3326 | 3326 | **容器组件**是连接到 Redux Store的组件的非正式术语。容器组件*订阅* Redux 状态更新和*dispatch*操作,它们通常不呈现 DOM 元素; 他们将渲染委托给展示性的子组件。
|
3327 | 3327 |
|
3328 |
| -171. ### Redux中常量的用途是什么? |
| 3328 | +171. ### Redux 中常量的用途是什么? |
3329 | 3329 |
|
3330 | 3330 | 常量允许您在使用 IDE 时轻松查找项目中该特定功能的所有用法。它还可以防止你拼写错误,在这种情况下,你会立即得到一个`ReferenceError`。
|
3331 | 3331 |
|
|
3377 | 3377 | }
|
3378 | 3378 | ```
|
3379 | 3379 |
|
3380 |
| -172. ### 编写`mapDispatchToProps()`有哪些不同的方法? |
| 3380 | +172. ### 编写 `mapDispatchToProps()` 有哪些不同的方法? |
3381 | 3381 |
|
3382 | 3382 | 有一些方法可以将*action creators*绑定到`mapDispatchToProps()`中的`dispatch()`。以下是可能的写法:
|
3383 | 3383 |
|
|
3399 | 3399 |
|
3400 | 3400 | 第三种写法只是第一种写法的简写。
|
3401 | 3401 |
|
3402 |
| -173. ### 在`mapStateToProps()`和`mapDispatchToProps()`中使用`ownProps`参数有什么用? |
| 3402 | +173. ### 在 `mapStateToProps()` 和 `mapDispatchToProps()` 中使用 `ownProps` 参数有什么用? |
3403 | 3403 |
|
3404 | 3404 | 如果指定了`ownProps`参数,React Redux 会将传递给该组件的 props 传递给你的*connect*函数。因此,如果您使用连接组件:
|
3405 | 3405 |
|
|
3443 | 3443 |
|
3444 | 3444 | *Saga*就像你的项目中的一个单独的线程,它独自负责副作用。`redux-saga` 是一个 redux *中间件*,这意味着它可以在项目启动中使用正常的 Redux 操作,暂停和取消该线程,它可以访问完整的 Redux 应用程序状态,并且它也可以调度 Redux 操作。
|
3445 | 3445 |
|
3446 |
| -177. ### 在 redux-saga 中`call()`和`put()`之间有什么区别?? |
| 3446 | +177. ### 在 redux-saga 中 `call()` 和 `put()` 之间有什么区别? |
3447 | 3447 |
|
3448 | 3448 | `call()`和`put()`都是 Effect 创建函数。 `call()`函数用于创建 Effect 描述,指示中间件调用 promise。`put()`函数创建一个 Effect,指示中间件将一个 Action 分派给 Store。
|
3449 | 3449 |
|
|
3467 | 3467 |
|
3468 | 3468 | *Redux Thunk*中间件允许您编写返回函数而不是 Action 的创建者。 thunk 可用于延迟 Action 的发送,或仅在满足某个条件时发送。内部函数接收 Store 的方法`dispatch()`和`getState()`作为参数。
|
3469 | 3469 |
|
3470 |
| -179. ### `redux-saga`和`redux-thunk`之间有什么区别? |
| 3470 | +179. ### `redux-saga` 和 `redux-thunk` 之间有什么区别? |
3471 | 3471 |
|
3472 | 3472 | *Redux Thunk*和*Redux Saga*都负责处理副作用。在大多数场景中,Thunk 使用*Promises*来处理它们,而 Saga 使用*Generators*。Thunk 易于使用,因为许多开发人员都熟悉 Promise,Sagas/Generators 功能更强大,但您需要学习它们。但是这两个中间件可以共存,所以你可以从 Thunks 开始,并在需要时引入 Sagas。
|
3473 | 3473 |
|
|
3503 | 3503 | 2. 验证(同步/异步)和提交。
|
3504 | 3504 | 3. 字段值的格式化,解析和规范化。
|
3505 | 3505 |
|
3506 |
| -185. ### 如何向Redux添加多个中间件? |
| 3506 | +185. ### 如何向 Redux 添加多个中间件? |
3507 | 3507 |
|
3508 | 3508 | 你可以使用`applyMiddleware()`。
|
3509 | 3509 |
|
|
3677 | 3677 | | React Native 是一种 React 类型,它用于构建移动应用程序,它更快,更稳定 | Ionic,Angular 的移动 app 相对原生 app 来说不太稳定和慢 |
|
3678 | 3678 | | 在 Reac t中,数据只以单一方向传递,因此调试很容易 | 在 Angular 中,数据以两种方式传递,即它在子节点和父节点之间具有双向数据绑定,因此调试通常很困难 |
|
3679 | 3679 |
|
3680 |
| -201. ### 为什么 Reac t选项卡不会显示在 DevTools 中? |
| 3680 | +201. ### 为什么 React 选项卡不会显示在 DevTools 中? |
3681 | 3681 |
|
3682 | 3682 | 当页面加载时,*React DevTools*设置一个名为`__REACT_DEVTOOLS_GLOBAL_HOOK__`的全局变量,然后 React 在初始化期间与该钩子通信。如果网站没有使用 React,或者如果 React 无法与 DevTools 通信,那么它将不会显示该选项卡。
|
3683 | 3683 |
|
|
3719 | 3719 |
|
3720 | 3720 | Relay 是一个 JavaScript 框架,用于使用 React 视图层为 Web 应用程序提供数据层和客户端与服务器之间的通信。
|
3721 | 3721 |
|
3722 |
| -205. ### 如何在`create-react-app`中使用TypeScript? |
| 3722 | +205. ### 如何在 `create-react-app` 中使用 TypeScript? |
3723 | 3723 |
|
3724 | 3724 | 当您创建一个新项目带有`--scripts-version`选项值为`react-scripts-ts`时便可将 TypeScript 引入。
|
3725 | 3725 |
|
|
3790 | 3790 | console.log(totalSelector(exampleState)) // { total: 2.322 }
|
3791 | 3791 | ```
|
3792 | 3792 |
|
3793 |
| -208. ### Redux中的 Action 是什么? |
| 3793 | +208. ### Redux 中的 Action 是什么? |
3794 | 3794 |
|
3795 | 3795 | *Actions*是纯 JavaScript 对象或信息的有效负载,可将数据从您的应用程序发送到您的 Store。 它们是 Store 唯一的数据来源。 Action 必须具有指示正在执行的操作类型的 type 属性。
|
3796 | 3796 |
|
|
3839 | 3839 |
|
3840 | 3840 | Redux 最初是用 ES6 编写的,用 Webpack 和 Babel 编译成 ES5。 无论您的 JavaScript 构建过程如何,您都应该能够使用它。Redux 还提供了一个 UMD 版本,可以直接使用而无需任何构建过程。
|
3841 | 3841 |
|
3842 |
| -212. ### Redux Form 的`initialValues`如何从状态更新? |
| 3842 | +212. ### Redux Form 的 `initialValues` 如何从状态更新? |
3843 | 3843 |
|
3844 | 3844 | 你需要添加`enableReinitialize:true`设置。
|
3845 | 3845 |
|
|
4864 | 4864 | export default App;
|
4865 | 4865 | ```
|
4866 | 4866 |
|
4867 |
| -273. ### 什么是 dynamic import? |
| 4867 | +273. ### 什么是动态导入? |
4868 | 4868 |
|
4869 |
| - dynamic import() 语法是 ECMAScript 提案,目前不属于语言标准的一部分。它有望在不久的将来被采纳。在你的应用程序中,你可以使用 dynamic import() 来实现代码拆分。让我们举一个加法的例子: |
| 4869 | + 动态导入语法是 ECMAScript 提案,目前不属于语言标准的一部分。它有望在不久的将来被采纳。在你的应用程序中,你可以使用动态导入来实现代码拆分。让我们举一个加法的例子: |
4870 | 4870 |
|
4871 | 4871 | 1. **Normal Import**
|
4872 | 4872 | ```javascript
|
|
0 commit comments