经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
聊聊 React
来源:cnblogs  作者:apolis  时间:2021/1/25 11:11:34  对本文有异议

都说 React 开发效率高,但效率高在哪呢?来细看看。

用 d3 写一个 List:

  1. const renderList = data => {
  2. d3.select("ul")
  3. .selectAll("li")
  4. .data(data, d => d.id)
  5. .join(
  6. enter => enter.append("li").text(d => d.text),
  7. update => update.text(d => d.text),
  8. exit => exit.remove()
  9. );
  10. };

d3 把 view 和 data 的关系分为 3 种:

  • enter:有 data 没 view
  • update:有 data 有 view
  • exit:有 view 没 data

数据更新,开发者需考虑「新 view」对比「老 view」,新增的「enter」、更新的「update」、减少的「exit」要怎么处理。


用 React 来写:

  1. const List = ({ data }) => {
  2. return (
  3. <ul>
  4. {data.map(d => (
  5. <li key={d.id}>{d.text}</li>
  6. ))}
  7. </ul>
  8. );
  9. };

数据更新,开发者只需考虑「新 view」是什么样,不用考虑怎么把「老 view」变成「新 view」,比 d3 简单。


React 是不是比 d3 好用?

答:不一定,要看场景。React 框架把「新增的、更新的、减少的处理」都做了,开发者没法干预。但如果你想做一些动画,需要精细控制「新增的、更新的、减少的」,React 就不如 d3 好用了。

再看 React 代码:

  1. const List = ({ data }) => {
  2. return (
  3. <ul>
  4. {data.map(d => (
  5. <li key={d.id}>{d.text}</li>
  6. ))}
  7. </ul>
  8. );
  9. };

React 把组件简化成了一个函数,data -> view。组件就是函数,意味着函数可以怎么玩,组件就可以怎么玩。

  • 函数内调用别的函数

    1. function a() {}
    2. function b() {}
    3. function c() {
    4. a();
    5. b();
    6. }
    1. function A() {}
    2. function B() {}
    3. function C() {
    4. return (
    5. <div>
    6. <A />
    7. <B />
    8. </div>
    9. );
    10. }
  • 函数的返回值作为别的函数的传参

    1. function a() {}
    2. function b(arg) {}
    3. function c() {
    4. b(a());
    5. }
    1. function A() {}
    2. function B({ children }) {
    3. return <div>{children}</div>;
    4. }
    5. function C() {
    6. return (
    7. <B>
    8. <A />
    9. </B>
    10. );
    11. }
  • 高阶函数

    1. function memoize(fn) {
    2. const cache = {};
    3. return arg => {
    4. if (cache[arg]) return cache[arg];
    5. else {
    6. const result = fn(arg);
    7. cache[arg] = result;
    8. return result;
    9. }
    10. };
    11. }
    12. const memoizedSqrt = memoize(Math.sqrt);
    1. const A = () => {};
    2. const wrapper = Cmp => {};
    3. const WrappedA = wrapper(A);
  • Continuation,或者叫 Callback。Callback 的特点是:等时机成熟后才执行。

    1. const handler = () => {};
    2. button.addEventListener("click", handler);
    1. // Context Consumer
    2. <ThemeContext.Consumer>
    3. {theme => <Cmp theme={theme} />}
    4. </ThemeContext.Consumer>
    1. // Render Props
    2. const MouseTracker = Cmp => {
    3. return (
    4. <Mouse
    5. render={mouse => <Cmp mouse={mouse} />}
    6. />
    7. );
    8. };
  • 递归

    1. const factorial = n => {
    2. if (n === 1) return 1;
    3. else return n * factorial(n - 1);
    4. };
    1. const Tree = ({ data }) => (
    2. <ul>
    3. {data.map(d => (
    4. <li key={d.id}>
    5. {d.text}
    6. {d.children && <Tree data={d.children} />}
    7. </li>
    8. ))}
    9. </ul>
    10. );

React 组件的种种用法,本质都是函数的用法。从函数的角度来理解、运用 React,就不会觉得这个框架很神秘了。

原文链接:http://www.cnblogs.com/apolis/p/14301181.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号