您现在的位置是:亿华云 > 域名
React核心成员表示:JSX就是个错误
亿华云2025-10-02 18:45:36【域名】8人已围观
简介近日,在一场关于JSX的讨论中,React核心成员「Sebastian Markbåge」(Hooks作者)表示:他更推崇SwiftUI语法,并认为JSX就是个错误。JSX最早由Facebook提出并
近日,心成在一场关于JSX的员表讨论中,React核心成员「Sebastian Markbåge」(Hooks作者)表示:
他更推崇SwiftUI语法,个错并认为JSX就是心成个错误。
JSX最早由Facebook提出并推广,员表在React中被广泛用来描述视图状态。个错
作为一种类XML的心成JS语法糖,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,而class在HTML中代表「类名」。
所以当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。服务器租用
在保证强大的编程能力同时,也希望在视图表现力方面做的更好。
接下来我们通过一个简单的「点击加一」的计数器来对比React与SwiftUI语法:
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么?你觉得未来他会被谁取代?或者他会取代谁?
很赞哦!(57)
上一篇: 数据中心基础设施管理(DCIM)五大趋势
下一篇: 为什么Telnet依旧很流行!