React核心成员表示:JSX就是个错误

news/2024/7/19 14:32:30 标签: gwt, javascript, html, 编程语言, js
htmledit_views">
js_content">

近日,在一场关于JSX的讨论中,React核心成员「Sebastian Markbåge」Hooks作者)表示:

他更推崇SwiftUI语法,并认为JSX就是个错误。

JSX最早由Facebook提出并推广,在React中被广泛用来描述视图状态。

作为一种类XMLJS语法糖,JSX同时兼顾了两个优点:

XML对树状结构优秀的表现力

不管是「嵌套」还是「属性」JSX都能很自然的描述。

我们可以很容易从如下JSX结构推导出实际视图效果:

<div style={{color: '#f00'}}>
  i am <span>Ka Song</span>
</div>

JS在运行时的灵活

曾有人说:

JSX就是拥有超能力的HTML

这里的超能力指:JSX作为JS语法糖,可以用JS语法灵活的描述视图状态。

function App({children}) {
  return (
    <div>
      {children || 'i am empty'}
    </div>
  )
}

作为对比,Vue模版语法的表现力就差很多。

然而,吾之蜜糖彼之砒霜:

JS语法限制的XML

比如class属于JS语法keyword,而classHTML中代表「类名」

所以当JSX使用className作为「类名」props时难免让人困惑。

<div className="container"></div>

依赖编译

JSX需要先编译为JS才能在宿主环境执行,所以使用JSX描述视图的框架(比如React)都需要依赖编译工具。

这增加了项目环境配置的复杂度。

DSL哪家强?

到这里我们可以发现,衡量一门DSL(领域相关语言)优劣的标准有三点:

  • 是否能直观描述视图状态

  • 是否有灵活的编程能力

  • 原生支持还是需要编译

让我们按这三个维度权衡几种不同平台的DSL

HTML

视图描述能力:????????????

编程能力:????

不需要编译:????

HTML描述视图能力最强(因为与DOM节点一一对应),但是缺乏编程能力。

Pug、Vue、JSX

视图描述能力:????????????

编程能力:????????~????????????

都是在XML基础上演进的语法糖,拥有强大的描述视图能力。

他们的区别在于「编程能力」「模版语法」的束缚之间取舍。

Flutter

视图描述能力:????

编程能力:????????????????

使用函数调用的方式描述视图,编程能力很强。

但是在描述嵌套的组件树结构时,函数调用不如XML描述能力强。

比如如下HTML结构:

<div>
  <p>Hello</p>
  <p>I am</p>
  <p>Ka Song</p>
</div>

Flutter语法描述:

Stack(
  children: <Widget>[
     Text("Hello"),
     Text("I am"),
     Text("Ka Song")
   ],
)

SwiftUI与React

SwiftUI作为被苹果寄予厚望、意图统领IOS全平台的DSL

在保证强大的编程能力同时,也希望在视图表现力方面做的更好。

接下来我们通过一个简单的「点击加一」的计数器来对比ReactSwiftUI语法:

React使用class语法:

class Counter extends React.Component {
  state = {
    counter: 0
  }
  increment: () => {
    const {counter} = this.state;
    this.setState({counter: counter + 1})
  }
  render() {
    const {counter} = this.state;
    return (
      <>
        <p>数字:{counter}</p>
        <button onClick={this.increment}>点我加一</button>
      </>
    )
  }
}

SwiftUI

struct Counter : View {
    @State var counter = 0

    func increment () {
        counter += 1
    }

    var body: some View {
        VStack {
            Text("数字: \(counter)")
            Button(action: increment) {
                Text("点我加一")
            }
        }
    }
}

可以看到,抛开语法差异,两个框架的写法是很类似的。

同时,SwiftUI凭借强大的编程能力,原生实现React当前并不支持的功能:

比如,在React中,子组件要改变父组件的状态,需要父组件将「状态」「改变状态的方法」传递给子组件。

子组件调用「改变状态的方法」通知父组件状态变化,父组件再传递变化后的「状态」给子组件。

这种方式在React中被称为「受控组件」

SwiftUI中,子组件只需要将父组件传递的状态申明为@Binding,就能达到与父组件该状态「双向绑定」的效果。

比如上例的counter

// 从
@State var counter = 0
// 变为
@Binding var counter

则计数器接受父组件传递的counter状态,子组件counter状态改变后会作用于父组件counter状态。

你更喜欢哪种DSL

从2013年5月29日React诞生到现在。

经过8年的教育,大部分React开发者已经接受JSX

但是,这期间也不断有人提出JSX的替代方案。

比如react-hyperscript。

随着SwiftUI热度提升,更是有人提出用其替代React中的JSX

也有人做出模型experimental-react-like-framework

你喜欢JSX么?你觉得未来他会被谁取代?或者他会取代谁?


http://www.niftyadmin.cn/n/1251356.html

相关文章

华硕笔记本BIOS设置详解

BIOS是英文Basic Input/Output System的缩写&#xff0c;即基本输入输出系统&#xff0c;合理的BIOS设置可以让我们的电脑更好的为我们服务&#xff0c;但由于大部分笔记本的BIOS界面是英文&#xff0c;并且BIOS里面的某些关键选项稍有差池就会导致各种各样的问题&#xff0c;导…

c 语言string类用法,C++中的string类用法简介

本文主要介绍C中的string类的常见用法。1. 概述string是C标准库的一个重要的部分&#xff0c;主要用于字符串处理。可以使用输入输出流方式直接进行string操作&#xff0c;也可以通过文件等手段进行string操作。同时&#xff0c;C的算法库对string类也有着很好的支持&#xff0…

字跳三轮面试完,我想去读个硕士了T_T

最近我发现公司里&#xff0c;计算机相关专业的硕士越来越多。在领英上搜索“高级软件工程师”&#xff0c;发现大厂约 70% 高级软件工程师都有名校硕士背景。就离谱&#xff01;这两年&#xff0c;计算机行业这么“卷”的吗&#xff1f;&#xff01;&#xff01;看完雇员背景&…

JAVA SortedMap接口

SortedMap接口主要提供有序的Map实现。 Map的主要实现有HashMap,TreeMap,HashTable,LinkedHashMap。 TreeMap实现了SortedMap接口&#xff0c;保证了有序性。默认的排序是根据key值进行升序排序&#xff0c;也可以重写comparator方法来根据value进行排序。 HashMap与TreeMap…

算法24c语言,EEPROM(AT24C16)页写算法

1.写在前面学习单片机或者从事嵌入式开发的&#xff0c;对于EEPROM绝不会陌生&#xff0c;尤其的24系列的EEPROM很是经典&#xff0c;如AT24C02、AT24C16等。 驱动起这个系列的EEPROM&#xff0c;可以说是轻而易举&#xff0c;各类教程、源码、驱动都可以轻松找到并作稍微改动即…

卧槽!VSCode 竟然可以整成小霸王游戏机?

文章授权转载自&#xff1a;gamedilong&#xff0c;文末有原文链接。今天给大家分享一下自己最近撸的一款 vscode 游戏插件&#xff0c;基于 vscode 的休闲放松利器。前言开始会先介绍该插件的安装使用方式&#xff0c;然后简单介绍下主要的开发步骤。安装&运行安装和其他的…

Java中映射Map的merge、compute、computeIfAbsent、computeIfPresent基本用法

下面是Java8中Map的一些新方法merge、compute、computeIfAbsent、computeIfPresent介绍。 我们在项目开发中&#xff0c;经常使用map&#xff0c;key有时存在有时不存&#xff0c;我们需要是用containsKey去判断&#xff0c;然后再决定如何修改value。 这样比较麻烦&#xff0…

android自定义线程池工具类,Android 并发工具类与线程池

该文章是一个系列文章&#xff0c;是本人在Android开发的漫漫长途上的一点感想和记录&#xff0c;如果能给各位看官带来一丝启发或者帮助&#xff0c;那真是极好的。前言上一篇说到了Android并发编程中的 原子类与并发容器,那么本篇呢,继续上一篇记录一下Android并发编程中常用…