react slot

1 use chirdren

  1. class BaseLayout extends React.Component {
  2. static Header = Header
  3. static Body = Body
  4. static Footer = Footer
  5. render() {
  6. const {children} = this.props
  7. const header = children.find(child => child.type === Header)
  8. const body = children.find(child => child.type === Body)
  9. const footer = children.find(child => child.type === Footer)
  10. return (
  11. <div class="container">
  12. <header>
  13. {header ? header.props.children : null}
  14. </header>
  15. <main>
  16. {body ? body.props.children : null}
  17. </main>
  18. <footer>
  19. {footer ? footer.props.children : null}
  20. </footer>
  21. </div>
  22. )
  23. }
  24. }
  25. =
  26. // This code...
  27. <Button children={<span>Click Me</span>} />
  28. // Is equivalent to this code...
  29. <Button>
  30. <span>Click Me</span>
  31. </Button>

2 use props

  1. function App({ user }) {
  2. return (
  3. <div className="app">
  4. <Nav>
  5. <UserAvatar user={user} size="small" />
  6. </Nav>
  7. <Body
  8. sidebar={<UserStats user={user} />}
  9. content={<Content />}
  10. />
  11. </div>
  12. );
  13. }
  14. // Accept children and render it/them
  15. const Nav = ({ children }) => (
  16. <div className="nav">
  17. {children}
  18. </div>
  19. );
  20. // Body needs a sidebar and content, but written this way,
  21. // they can be ANYTHING
  22. const Body = ({ sidebar, content }) => (
  23. <div className="body">
  24. <Sidebar>{sidebar}</Sidebar>
  25. {content}
  26. </div>
  27. );
  28. const Sidebar = ({ children }) => (
  29. <div className="sidebar">
  30. {children}
  31. </div>
  32. );
  33. const Content = () => (
  34. <div className="content">main content here</div>
  35. );

react 之 PropTypes验证

  1. import PropTypes from 'prop-types'
  2. Footer.propTypes = {
  3. completedCount: PropTypes.number.isRequired,
  4. activeCount: PropTypes.number.isRequired,
  5. onClearCompleted: PropTypes.func.isRequired,
  6. }

image.png

进阶

使用 PropTypes 进行类型检查

import PropTypes from ‘prop-types’;

Context

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。

代码分割

1 动态import
当使用 Babel 时,你要确保 Babel 能够解析动态 import 语法而不是将其进行转换。对于这一要求你需要 babel-plugin-syntax-dynamic-import 插件。

动态 import() 语法目前只是一个 ECMAScript (JavaScript) 提案, 而不是正式的语法标准。预计在不远的将来就会被正式接受。

  1. import("./math").then(math => {
  2. console.log(math.add(16, 26));
  3. });

2 基于路由的代码分割

和服务端进行交互

前端请求流程

在 Ant Design Pro 中,一个完整的前端 UI 交互到服务端处理流程是这样的:

  1. UI 组件交互操作;
  2. 调用 model 的 effect;
  3. 调用统一管理的 service 请求函数;
  4. 使用封装的 request.ts 发送请求;
  5. 获取服务端返回;
  6. 然后调用 reducer 改变 state;
  7. 更新 model。
  1. // models/user.ts
  2. import { queryCurrent } from '../services/user';
  3. ...
  4. effects: {
  5. *fetch({ payload }, { call, put }) {
  6. ...
  7. const response = yield call(queryCurrent);
  8. ...
  9. },
  10. }
  11. // services/user.ts
  12. import request from '../utils/request';
  13. export async function query() {
  14. return request('/api/users');
  15. }
  16. export async function queryCurrent() {
  17. return request('/api/currentUser');
  18. }

request.ts

https://github.com/ant-design/ant-design-pro/blob/master/src/utils/request.ts

开发趋势

css_modules
hooks
ts支持
开发启动快,支持一键开启 dll 等
以路由为单元的 code splitting 等

考虑将技术栈转移到
Umi
ant-design-pro
ant-design-mobile
TS