返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Svelte 和 React的比较详解(一)
  • 305
分享到

Svelte 和 React的比较详解(一)

Svelte 和 React比较Svelte  React 2023-05-18 05:05:07 305人浏览 安东尼
摘要

目录比较 Svelte 和 React 验证从使用者角度开发条件渲染比较 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.com': '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.com': '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 的依赖项——此时我们必须将它包装在 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比较内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Svelte 和 React的比较详解(一)

本文链接: https://lsjlt.com/news/211617.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Svelte 和 React的比较详解(一)
    目录比较 Svelte 和 React 验证从使用者角度开发条件渲染比较 Svelte 和 React 在这篇文章中,我将告诉您我更喜欢 Svelte 还是 React,不...
    99+
    2023-05-18
    Svelte 和 React比较 Svelte  React
  • Vue和React的比较
    这篇文章主要讲解了“Vue和React的比较”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue和React的比较”吧!在过去的 5 年中,我一直是一名 R...
    99+
    2024-04-02
  • Android getViewById和getLayoutInflater().inflate()的详解及比较
    Android getViewById和getLayoutInflater().inflate()的详解及比较      &n...
    99+
    2022-06-06
    Android
  • java compareTo和compare方法比较详解
    这两个方法经常搞混淆,现对其进行总结以加深记忆。 compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要...
    99+
    2024-04-02
  • Java中的maven和gradle的比较与使用详解
    目录1 构建工具的简单介绍2 maven、gradle的简单使用方法2.1 创建maven项目2.2 maven的使用2.3 gradle的使用3 总结1 构建工具的简单介绍 在代码...
    99+
    2024-04-02
  • 详解React中Props的浅对比
    目录类组件的Props对比 shallowEqual 浅对比函数组件的浅对比 上一周去面试的时候,面试官我PureComponent里是如何对比props的,概念已经牢记脑中,脱口而...
    99+
    2024-04-02
  • 2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较
    文章目录 React:构建用户界面的首选Vue:简单优雅的前端框架Angular:Google支持的全面框架Node.js:服务器端的JavaScript运行环境比较不同框架的优势与劣势Rea...
    99+
    2023-09-26
    javascript react.js vue.js web3 java
  • 详解java关于对象的比较
    目录同类型对象的比较样例引入相等性判断总结同类型对象的比较 三个维度去比较 同一性 相等性 相似性 样例引入 想象一下这样的一个场景:小王去图书馆借了一本java核心技术卷1,如图 ...
    99+
    2024-04-02
  • React中的浅比较是怎么工作的
    这篇文章主要介绍了React中的浅比较是怎么工作的的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的浅比较是怎么工作的文章都会有所收获,下面我们一起来看看吧。想要理解浅比较的概念,最直接的方法就是研究...
    99+
    2023-06-30
  • Python解惑之整数比较详解
    前言 在 Python 中一切都是对象,毫无例外整数也是对象,对象之间比较是否相等可以用==,也可以用is。 ==和is操作的区别是: is比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一...
    99+
    2022-06-04
    整数 详解 Python
  • C语言的各类变量和零值的比较详解
    目录1.波尔变量和零值比较2.整形变量和零进行比较3.浮点变量和零值比较4.指针和零值比较总结 1.波尔变量和零值比较 在C语言中本来是不存在bool类型的,但在C99标准中加入了b...
    99+
    2024-04-02
  • Golang数据类型比较详解
    目录 基本数据类浮点比较字符串比较引用类型slice、mapslice、map比较channel、指针聚合类型数组结构体接口最后做个练习直接使用==比较的情况 分类说明是否...
    99+
    2023-05-15
    Golang数据类型比较 Golang数据类型 Golang数据
  • Javadouble类型比较大小详解
    目录Java double类型比较大小一、问题描述二、解决方法关于两个double类型数的大小判断Java double类型比较大小 一、问题描述 把从数据库里查询出来的数据,金额小...
    99+
    2024-04-02
  • redis和mysql哪个比较难一点
    了解redis和mysql哪个比较难一点?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!一、redis和mysql的区别总结...
    99+
    2024-04-02
  • debian和ubuntu哪一个比较好用
    这篇文章主要讲解了“debian和ubuntu哪一个比较好用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“debian和ubuntu哪一个比较好用”吧!早在Ubuntu问世之前,Debian...
    99+
    2023-06-13
  • 一口价域名和竞价比较
    一口价域名和竞价域名是两种常见的域名交易方式。一口价域名是由出售者设定一个固定价格出售域名,而竞价域名则允许潜在买家提交出价,最后由出价最高的用户获得域名。在选择购买域名时,了解这两种交易方式的优劣势非常重要。下面对一口价域名和竞价比较一...
    99+
    2024-01-23
    一口价域名和竞价比较 域名竞价 域名知识
  • 阿里云服务器的区别一次详细的比较和分析
    在选择阿里云服务器时,用户可能会面临一些困惑:不同的服务器类型、配置和价格之间是否存在显著的区别?阿里云服务器之间是否真的存在显著的性能差距?这些问题在本文中将得到解答。 阿里云服务器是阿里云提供的一种高性能、可扩展的云计算服务,可以帮助用...
    99+
    2023-11-18
    阿里 区别 服务器
  • react的context和props详解
    目录一、context1. 使用场景2. 使用步骤3. 总结二、props深入1. children 属性2. props 校验3. props校验使用步骤4. props校验约束规...
    99+
    2024-04-02
  • Java和JavaScript的比较(转)
    *Netscape 把 Livescript 改名为 Javascript , 这是Java的一个有趣的变异, 用于客户一方的用户化 *用Java 进行细节编程, 而JavaScript 用于客户接口和系统的全部综合 *JavaScript...
    99+
    2023-06-03
  • GO框架和Laravel:一个比较分析
    随着互联网的发展,Web开发已经成为了一个非常重要的领域。而作为Web开发中的两个重要框架,GO框架和Laravel在业界都有着很高的声誉。那么这两个框架各自的优缺点是什么呢?下面我们来进行一个比较分析。 一、性能比较 首先,我们来看一下...
    99+
    2023-10-14
    框架 javascript laravel
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作