可替代的JSX基础知识入门_jsx小白教程

不仅仅是在React(或受JSX启发模板),对于在各种框架中进行模板化,JSX是如今一个非常受欢迎的选择。然而,如果你不喜欢使用JSX,或者你的项目想避免使用它,又或者只是受好奇心驱使,你想尝试如果不用JSX该怎么写React代码。最简单的答案是去阅读官方文档,然而官方文档有点短,以下有几个更多的选择。免责声明:就我个人而言,我喜欢JSX,在我所有React

可替代的JSX基础知识入门

不仅仅是在React(或受JSX启发模板),对于在各种框架中进行模板化,JSX是如今一个非常受欢迎的选择。然而,如果你不喜欢使用JSX,或者你的项目想避免使用它,又或者只是受好奇心驱使,你想尝试如果不用JSX该怎么写React代码。最简单的答案是去阅读官方文档,然而官方文档有点短,以下有几个更多的选择。

可替代的JSX基础知识入门_jsx小白教程

 

什么是JSX

首先,我们需要了解JSX是什么,以便在纯JavaScript中编写正确的代码。JSX是一门特定领域语言,这意味着我们需要使用JSX转变我们的代码以便获得能运行的Javscript代码,不然浏览器理解不了我们的代码。在光明的未来,如果你想在你的目标浏览器中使用 模块化 和其他支持的所需功能,你依然没有能力完全抛弃代码转换,这将是个问题

想要搞懂JSX最终被转换成什么,最好的办法也许是使用 babel repl。你需要点击 presets(应该在面板左侧)还有在那里选择 react,这样 babel 才能正确地完成转换。完成上面步骤后你会在右侧面板实时看到转换得到的JavaScript代码。例如,你可以试着输入下面代码

class A extends React.Component {
    render() {
        return (
            <div className={"class"} onclick={some}>
                {"something"}
                <div>something else</div>
            </div>
        )
    }
}

我得到的代码如下所示

class A extends React.Component {
  render() {
    return React.createElement("div", {
      className: "class",
      onclick: some
    }, "something", React.createElement("div", null, "something else"));
  }
}

你可以看到每对 <%tag%> 结构都被 React.createElement 这个函数代替。第一个参数是react 组件或者是内置的标签字符串(如 div、span),第二个参数跟属性相关,剩余的参数都被看作是孩子节点。

我强烈建议你去做不同的操作生成不同的树,去看看有什么不同。例如看看 React 是怎么渲染 true 或 false、数组、组件还有其他等等。即使你只用JSX或只用 babel repl 做格式化把内容搞得漂亮点,这对于你来说也是很有帮助的。

重命名

虽然我们用以上的方式生成的代码完全有效,并且我们可以用这种方式编写所有的React代码,但这种方法存在一些问题。

第一个问题是它非常冗长。真的很冗长,这是 React.createElement 造成的。所以第一个解决方案是将它先赋值到一个变量,通常叫做 h 表示 hyperscript。这将为你节省大量文本,代码也更具可读性。为了说明这一点,我们重写一下之前的例子

const h = React.createElement;
class A extends React.Component {
  render() {
    return h(
      "div",
      {
        className: "class",
        onclick: some
      },
      "something",
      h("div", null, "something else")
    );
  }
}

Hyperscript

如果你使用 React.createElement 或 h 进行一些操作,你会发现它有几个缺陷。首先,这个函数需要三个参数。因此如果没有属性,你还必须要提供 null 占位,而 className这个可能最常用的属性,每次都要先写入一个对象再写这个属性。

你可以 react-hyperscript 作为代替方案。它并需要提供空属性作为参数,也允许你使用类似emmet的风格(div#main.content -\> <div>)指定class和id。因此,我们的代码会有一点改善:

class A extends React.Component {
  render() {
    return h("div.class", { onclick: some }, [
      "something",
      h("div", "something else")
    ]);
  }
}

HTM

如果你不反对JSX,但不喜欢强制转译你的代码,这里有个叫 htm 的项目也许适合你。它的目标(看起来)是跟JSX做同样的事,但使用模板语法。这肯定会增加一些额外的开销(这些模版在运行时进行解析),但在你的情况也许是值得的。

它的工作方式是包裹元素函数,在我们这里这个函数就是 React.createElement,但也可以是其他相似的API,然后返回一个函数,这个函数将会解析我们的模版然后准备返回跟 babel 一样的结果,但这些事仅仅在运行时执行。

const html = htm.bind(React.createElement);
class A extends React.Component {
    render() {
        return html`
            <div className=${"class"} onclick=${some}>
                ${"something"}
                <div>something else</div>
            </div>
        `
    }
}

如你所见,它与真正的JSX几乎相同,我们只需要以稍微不同的方式插入变量;但是,这些主要是细节,如果你想在没有任何工具设置的情况下展示如何使用React,这也许很方便。

类Lisp语法

这个想法跟hyperscript相似,但是,这是个值得一看的优雅方法。这也很多类似的帮忙库,所以这是我的主观选择;这也许能给你的项目带来灵感。

将这种方法付诸实践,你编写模版的时候只需要用到数组,将位置作为参数。这样子的好处是你不用一味编写 h 函数(是的,即使这可能是重复的!)。下面是一个使用例子:

function render(structure) {
  return h('nodeName', 'attributes', 'children')(structure)
}
class A extends React.Component {
  render() {
    return render([
      'div', { className: 'class', onClick, some}, [
        'something',
        ['div', 'something else']
      ]]);
  }
}

总结

本文没有建议你不要使用JSX,也没有探讨JSX是否一个坏主意。你可能在想如果不用JSX你的代码能写成个什么样子,本文的目的只是回答这个问题。

海计划公众号
(0)
上一篇 2020/03/30 07:13
下一篇 2020/03/30 07:13

您可能感兴趣的内容

  • javascript怎么判断是否为json?菜鸟知识_json入门知识

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。1、使用正则表达式判断是否是jsonif (/^[\],:{}\

    2020/03/20
  • CSRF跨站请求伪造使用教程_csrf菜鸟教程下载

    CSRF 介绍CSRF,是跨站请求伪造(Cross Site Request Forgery)的缩写,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。CSRF 攻

    2020/03/23
  • zblog菜鸟指南_开源免费、小巧强大的博客程序与CMS建站系统

    zblog小白知识 官方网址:https://www.zblogcn.com/ GitHub:https://github.com/zblogcn 简介描述:开源免费、小巧强大的博…

    2020/03/06
  • TypeScript 在 JavaScript 的基础上的改动基础知识_TypeScript菜鸟知识

    JavaScript是一种解释型的脚本语言,凭借着其简单,基于对象,跨平台的特性,活跃于各大网站制作中。而TypeScript则是以JavaScript作为基础,并对其扩展的一种新的语言,也就是说,在TypeScript中JavaScript的所有代码都可以畅行无阻,只有在出现跟TypeScript有关的代码时,TypeScript才会对其进行处理。Type

    2020/04/05
  • CSS calc()函数的用法零基础入门_函数基础知识教程

    CSS3 的 calc() 函数允许我们在属性值中执行数学操作。例如,我们可以使用 calc() 指定一个元素宽的固定像素值为多个数值的和。.foo {width: calc(100px + 50px);
    }为什么是 calc()如果你使用过 CSS 预处理器,比如 SASS,以上示例你或许碰到过.foo {width: 100px + 50px;
    }$wi

    2020/03/30
  • css重设样式小白教程清除浏览器的默认样式_浏览器小白基础

    由于不同的浏览器默认的样式也不同,所以在网页开发前设置一个公用样式,来清除各个浏览器的默认样式,已达到做的网页在各个浏览器中达到统一。收集的默认样式的链接地址:1.eric-meyer-reset-csshttp://cssreset.com/scripts/eric-meyer-reset-css/2.html-5-reset-stylesheethttp

    2020/04/05
  • vue router 路由鉴权(非动态路由)使用说明_路由小白基础

    概述角色:超级管理员、主题管理员、数据服务管理员权限:超级管理员:所有页面主题管理员:基础公共页面+主题设置页数据服务管理员:基础公共页面+数据服务设置页+数据服务审批页需求:角色菜单来自后端,当用户未通过页面菜单,直接从地址栏访问非权限范围内的url时,拦截用户访问并重定向到首页。实际系统中还有几种管理员,此处略去,以精简描述。原本想用动态路由的思路去做,

    2020/03/31
  • fuelux基础指南_基于Bootstrap的轻量级javascript框架

    fuelux基础指南 官方网址:http://getFuelUX.com GitHub:https://github.com/ExactTarget/fuelux 简介描述:基于B…

    2020/03/06
  • 电子信息产业网入门基础知识_电子信息产业权威门户网站

    电子信息产业网入门基础知识 官方网址:http://www.cena.com.cn/ 简介描述:电子信息产业权威门户网站 电子信息产业网是电子信息产业权威门户网站,创建于1999年…

    2020/03/06
  • 网站流量指标的结构零基础入门uv和ip、vv、pv详解_seo小白教程

    一、什么是PV? PV即Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断的刷新页面,也可以制造出非常高的PV。具体的说,PV值就是所有访问者在24小时(0点到

    2020/04/03
  • 多属性、多分类MySQL模式设计入门百科_模式菜鸟教程

    这是来自B乎的一个问答。当数据同时具备多个属性/分类时,改如何设计表结构和查询?1、需求描述我偶尔也会逛逛B乎,看到一些感兴趣的话题也会回复下。链接: https://www.zhihu.com/question/337083976/answer/767075575[mysql] 当数据同时属于多个分类时,该怎么查询?分类cate字段为[1,2,3,4,5]

    2020/03/26
  • Vue中 render 函数应用小白基础_render基础教程

    前言因为最近接手维护一个基于 ivew 的项目, 新增模块中包含很多自定义功能, 所以大量使用到了 render 函数; 故对其做一下总结…关于 render 函数, 官方文档也做了比较详细的介绍: render 函数: https://cn.vuejs.org/v2/guide… ; 一般组件我们都是用 template模板的方式去写; 有时候会造

    2020/03/24
  • 悦书小白教程_免费PDF文件阅读器

    悦书小白教程 官方网址:http://www.yueshupdf.com/ 简介描述:免费PDF文件阅读器 《悦书》是一款功能非常全面的PDF阅读软件,不仅可以满足大家随时随地阅读…

    2020/03/11
  • echarts是什么基础指南echart.js学习和使用_echarts入门教程

    什么是Echarts?简单来说呢它就是一个商业级数据图表,一个纯JavaScript的图标库。可以兼容绝大部分的浏览器,可以为前端开发提供一个直观、生动、可交互、可高度个性化定制的数据可视化图表。Echarts能实现哪些功能? 1.强大的Echarts提供创新的拖拽重计算2.数据视图、值域漫游等功能特性3.大大增强了用户体验4.并且赋予了用户对数据进行挖掘

    2020/04/03
  • Redis高可用,高性能,架构演进史教程视频_架构入门基础知识

    介绍上个礼拜,我搭建了一个mongo分片集群,发现分布式系统保证高可用和高性能的套路都差不多。高性能就是做分片(可以类比为分库分表,将数据分到不同服务器上),在Kafka中叫分区,在mongodb中叫shard,在HDFS上叫DataNode。而保证高可用的方式就是做交叉备份。然后我很好奇Redis是怎么部署的。上测试环境查看集群的状态info replic

    2020/03/26
  • 解决vue cli2和cli3打包后不能运行问题 Failed to load resource: net::ERR菜鸟教程网FILENOTFOUND_cli小白攻略

    原因:打包后的文件要在服务器中运行 解决方法:放在服务器中打开,依次在终端执行下面命令npm install http-server -g
    cd dist
    http-server
    另外,本地打开方法:vue cli2 将config文件夹内index.js文件中 build的assetsPublicPath的’/’改为’./’vue cli3 在项目根目录内

    2020/03/22