好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Svelte和React的区别是什么

本篇内容主要讲解“Svelte和React的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Svelte和React的区别是什么”吧!

比较 Svelte 和 React

?验证

在 React 中创建了一个? useCurrentUser ?的钩子,用于侦听身份验证更改并相应地设置一些状态。然后我可以在 React 任何地方使用,并在身份验证更改时重新渲染页面。

export?const?useCurrentUser?=?()?=>?{
??const?[currentUser,?setCurrentUser]?=?useState(undefined)

??useEffect(()?=>?{
????return?firebase.auth().onAuthStateChanged((details)?=>?{
??????setCurrentUser(
????????details
????????????{
??????????????displayName:?details.displayName,
??????????????provider:?{
????????????????'github测试数据':?'GitHub',
??????????????}[details.providerData[0].providerId],
??????????????uid:?details.uid,
????????????}
??????????:?null
??????)
????})
??},?[])
??return?[currentUser]
}

在任何组件中,都可以使用:

const?[currentUser]?=?useCurrentUser()

这可以让 任何组件快速 获取当前用户。唯一的 缺点 是在每一个页面都有一个? onAuthStateChanged ?监听器,

但可以通过 仅绑定一个侦听器 或将当前用户置于 执行上下文 中来解决。

执行上下文 ,在 Svelte 中可以采用的方法并使用可写存储。

export?const?currentUser?=?writable()

export?const?listenForAuthChanges?=?()?=>?{
??return?firebase.auth().onAuthStateChanged((details)?=>?{
????if?(details)?{
??????currentUser.set({
????????displayName:?details.displayName,
????????provider:?{?
??????????'github测试数据':?'GitHub',
????????}[details.providerData[0].providerId],
????????uid:?details.uid,
??????})
????}?else?{
??????currentUser.set(null)
????}
??})
}

在顶级 Svelte 组件中,我可以在? onMount ?中调用它,它将在挂载组件时执行(该函数是? return ?编辑的,因此我们在删除组件时取消订阅,就像? useEffect ?让你返回一个函数销毁)。

onMount(()?=>?{
??return?listenForAuthChanges()
})

这样在 Svelte 代码库中的任何地方,组件都可以导入? currentUser ?可写存储。您可以订阅它并手动控制状态更改:

currentUser.subscribe(newValue?=>?{
??...
})

或者,如果你想读取最新的值:

console.log($currentUser)

这就是 Svelte 的语法技巧厉害的地方;这个 $ 前缀会获取最新的值。

虽然对于初学者来说有点奇怪。但是,Svelte 就省去调用? subscribe ?的API。

就基本身份验证而言,两个库似乎都采用了类似的方法。虽然确切语法略有不同,但两者都允许您订阅 Firebase 侦听器并在身份验证状态更改时获得更新。

从使用者角度开发

Pomodone 是一个 25 分钟的计时器,并尽可能准确。如果浏览器选项卡处于后台(不是焦点选项卡),大多数浏览器将降低其? setTimeout ?调用的优先级并且不会严格按时运行它们。大多数时候在网络上这不是什么大不了的事,但是当用户通过您的应用程序跟踪 25 分钟的工作时,它就有问题,在 25 分钟的过程中,任何轻微的时间漂移都会导致最终时间相差甚远。但是,如果将这些超时转移到 Web Worker 中,它们应该会按时运行,并且不会被浏览器取消优先级。

因此,在我的? Tracker ?组件中,我需要实例化一个 Web Worker,向它发送消息并接收数据(例如剩余时间)。这时我发现 React 比 Svelte 更 重管理 的一个领域;

因为 React 组件在每次重新渲染时都会重新执行,所以很容易导致创建数千个 worker!必须使用 useRef 通过维护对您创建的工作程序的引用来避免此问题。

首先,我设置了组件所需的初始状态:

const?[currentPom,?setCurrentPom]?=?useState(null)
const?[currentUser]?=?useCurrentUser()
const?worker?=?useRef(null)

然后创建一个? useEffect ?挂钩,如果需要,它将实例化 worker,并绑定一个事件监听器来监听消息:

useEffect(()?=>?{
??if?(!worker.current)?{
????worker.current?=?new?Worker(workerURL)
????window.worker?=?worker.current
??}

??const?onMessage?=?(event)?=>?{
????if?(event.data.name?===?'tick')?{
??????setCurrentPom((currentPom)?=>?({
????????...currentPom,
????????secondsRemaining:?event.data.counter,
??????}))
????}?else?if?(event.data.name?===?'start')?{
??????//?More?branches?removed?here?to?save?space...
????}
??}
??worker.current.addEventListener('message',?onMessage)

??return?()?=>?{
????worker.current.removeEventListener('message',?onMessage)
??}
},?[currentUser])

然后,当用户点击“开始”按钮时,我必须向 worker 发送一条消息:

const?onStartPom?=?()?=>?{
??if?(!worker.current)?return
??worker.current.postMessage('startTimer')
}

Svelte 看起来非常相似,但在我看来有两个小的变化使 Svelte 代码更易于阅读:

我们不必将 worker 保留在? useRef ?中,只需将其分配给一个变量即可。

我们可以更轻松地将事件侦听器代码拉出到一个函数中,因为该函数不会成为? useEffect ?的依赖项&mdash;&mdash;此时我们必须将它包装在? useCallback ?中。

let?worker
onMount(()?=>?{
??worker?=?new?Worker(workerURL)
??worker.addEventListener('message',?onWorkerMessage)
??return?()?=>?{
????worker.removeEventListener('message',?onWorkerMessage)
??}
})

我们也不必使用 React 的? setX(oldX => newX) ?约定来设置状态,只需改变局部变量即可:

function?onWorkerMessage(event)?{
??if?(event.data.name?===?'tick')?{
????currentPom?=?{
??????...currentPom,
??????secondsRemaining:?event.data.counter,
????}
??}?else?if?(event.data.name?===?'start')?{
????//?More?branches?here?removed?to?save?space...
??}
}

这就是 Svelte 好的地方;两者非常相似,但是一旦习惯 Svelte, 感觉React就像在跳圈。你不能创建一个工作实例,它必须进入? useRef ?,然后你不能轻易地将代码拉出到一个函数中而不需要? useCallback ?所以它可以是对? useEffect ?的安全依赖。

使用 Svelte,我编写的代码更接近于“纯”JavaScript,而在 React 中,我的更多代码被包装在 React 原语中。

条件渲染

React 它只是 JavaScript。与 Svelte 的模板语言相比, React 中你不使用独特的模板语法而是在编写 JavaScript:

SideTabs

<ul>
??{pomsForCurrentDay.map(entryData,?index)?=>?{
????const?finishedAt?=?format(new?Date(entryData.timeFinished),?'H:mm:ss')
????return?<li?title={`Finished?at?${finishedAt}`}>{index?+?1}</li>
??})}
</ul>

在过去,我发现模板语言是趋势但不灵活,但 Svelte 提供了恰到好处的模板,同时也使您能够使用 JavaScript。也就是说,我总是会发现 React 的方法更简单 - 至少在我的脑海中 - 我认为对于熟悉 JavaScript 并正在学习库的人来说更友好。

然而,在渲染组件时,Svelte 确实对其语法进行了一些不错的修改(感觉非常像 JSX)。我最喜欢的是折叠道具的能力:

<History?pomodoros={pomodoros}?/>

Svelte (collapsed props)?

<History?{pomodoros}/>

到此,相信大家对“Svelte和React的区别是什么”有了更深的了解,不妨来实际操作一番吧!这里是***网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

查看更多关于Svelte和React的区别是什么的详细内容...

  阅读:46次