Solid.js就是我理想中的React计数器setintervalreact

我大约在三年前开始在工作中使用React。巧合的是,当时正好是ReactHooks出来的时候。我当时的项目代码库有很多类组件,总让我觉得很笨重。

我们来看看下面的例子:一个每秒递增一次的计数器。

classCounterextendsReact.Component{constructor(){super();this.state={count:0};this.increment=this.increment.bind(this);increment(){this.setState({count:this.state.count+1});componentDidMount(){setInterval(()=>{this.increment();},1000);render(){return

Thecountis:{this.state.count}

对于一个自动递增的计数器来说要写这么多代码可不算少。更多的模板和仪式意味着出错的可能性更大,开发体验也更差。

Hooks很漂亮,但是容易出错

当hooks出现的时候我非常兴奋。我的计数器可以简化为以下写法:

functionCounter(){const[count,setCount]=useState(0);useEffect(()=>{setInterval(()=>{setCount(count+1);},1000);},[]);return

Thecountis:{count}div>;

等等,这其实是不对的。我们的useEffecthook在count周围有一个陈旧闭包,因为我们没有把count包含在useEffect依赖数组中。从依赖数组中省略变量是Reacthooks的一个常见错误,如果你忘记了,有一些linting规则会警告你的。

我稍后会回到这个问题上。现在,我们把缺少的count变量添加到依赖数组中:

functionCounter(){const[count,setCount]=useState(0);useEffect(()=>{setInterval(()=>{setCount(count+1);},1000);},[count]);return

但现在我们遇到了另一个问题,看看应用程序的运行效果:

事实上哪种办法都行得通。我们在这里实现最后一个选项:

functionCounter(){const[count,setCount]=useState(0);useEffect(()=>{setInterval(()=>{setCount((count)=>count+1);},1000);},[]);return

我们的计数器修好了!由于依赖数组中没有任何内容,因此我们只创建了一个间隔。由于我们为计数设置器使用了回调函数,因此永远不会在count变量上有陈旧闭包。

假的响应性

Reacthooks的问题在于React并不是真正的响应式设计。如果linter知道一个效果(或回调或memo)hook何时缺少依赖项,那么为什么框架不能自动检测依赖项并对这些更改做出响应呢?

深入研究Solid.js

关于Solid,首先要注意的是它没有尝试重新发明轮子:它看起来很像React,因为React有一些显眼的模式:单向、自上而下的状态;JSX;组件驱动的架构。

如果我们用Solid重写Counter组件,会这样开始:

functionCounter(){const[count,setCount]=createSignal(0);return

Thecountis:{count()}div>;

到目前为止我们看到了一个很大的不同点:count是一个函数。这称为访问器(accessor),它是Solid工作机制的重要组成部分。当然,我们这里没有关于按间隔递增count的内容,所以下面把它添加进去:

functionCounter(){const[count,setCount]=createSignal(0);setInterval(()=>{setCount(count()+1);},1000);return

这肯定行不通,对吧?每次组件渲染时不会设置新的间隔吗?

没有。它就这么正常运行了。

但为什么会这样?好吧,事实证明Solid不需要重新运行Counter函数来重渲染新的计数。事实上,它根本不需要重新运行Counter函数。如果我们在Counter函数中添加一个console.log语句,就会看到它只运行一次。

functionCounter(){const[count,setCount]=createSignal(0);setInterval(()=>{setCount(count()+1);},1000);console.log('TheCounterfunctionwascalled!');return

在我们的控制台中,只有一个孤独的日志语句:

"TheCounterfunctionwascalled!"

"TheCounterfunctionwascalled!"在Solid中,除非我们明确要求,否则代码不会多次运行。

但是hooks呢?

于是我在Solid中解决了ReactuseEffecthook的问题,而无需编写看起来像hooks的东西。我们可以扩展我们的计数器例子来探索Solid效果。

如果我们想在每次计数增加时console.logcount怎么办?你的第一反应可能是在我们的函数中使用console.log:

functionCounter(){const[count,setCount]=createSignal(0);setInterval(()=>{setCount(count()+1);},1000);console.log(`Thecountis${count()}`);return

但这不起作用。请记住,Counter函数只运行一次!但我们可以使用Solid的createEffect函数来获得想要的效果:

functionCounter(){const[count,setCount]=createSignal(0);setInterval(()=>{setCount(count()+1);},1000);createEffect(()=>{console.log(`Thecountis${count()}`);return

这行得通!而且我们甚至不必告诉Solid,说这个效果取决于count变量。这才是真正的响应式设计。如果在createEffect函数内部调用了第二个访问器,它也会让效果运行起来。

一些更有趣的Solid概念

响应性,而不是生命周期hooks

const[count,setCount]=createSignal(0);setInterval(()=>{setCount(count()+1);},1000);createEffect(()=>{console.log(`Thecountis${count()}`);functionCounter(){return

并且代码仍然是有效的。我们的count信号不需要存在于一个组件函数中,依赖它的效果也不需要。一切都只是响应式系统的一部分,“生命周期hooks”实际上并没有起到太大的作用。

细粒度的DOM更新

考虑对我们的计数器进行以下调整:

functionCounter(){const[count,setCount]=createSignal(0);setInterval(()=>{setCount(count()+1);},1000);return(

The{(console.log('DOMupdateA'),false)}countis:{''}{(console.log('DOMupdateB'),count())}

运行它会在控制台中获得以下日志:

DOMupdateADOMupdateBDOMupdateBDOMupdateBDOMupdateBDOMupdateBDOMupdateB

换句话说,每秒更新的唯一内容是包含count的一小部分DOM。Solid甚至没有重新运行同一div中较早的console.log。

THE END
1.JSMethodInfo.MethodHandleProperty(Microsoft.JScript)See also JSMethod MethodInfo 在GitHub 上与我们协作 可以在 GitHub 上找到此内容的源,还可以在其中创建和查看问题和拉取请求。 有关详细信息,请参阅参与者指南。 .NET 反馈 .NET 是一个开放源代码项目。 选择一个链接以提供反馈: 提出文档问题 提供产品反馈 中文https://msdn.microsoft.com/zh-cn/library/vs/alm/microsoft.jscript.jsmethodinfo.methodhandle(v=vs.90).aspx
2.聊一聊Solid和Vue框架有啥差异性?腾讯云开发者社区Solid.js和Vue.js都是JavaScript框架,在开发者社区中引起了相当大的关注和采用。每个框架都满足了不同的需求和偏好,具有独特的方法论、理念和特性。本文旨在对它们进行评估,探讨它们的基本理念、架构、可用性、性能等方面。 让我们从两个简短的描述开始: https://cloud.tencent.com/developer/article/2357912
3.GitHubsolidjs/solidtestingSimple and complete Solid testing utilities that encourage good testing practices. - solidjs/solid-testing-libraryhttps://github.com/solidjs/solid-testing-library
4.solidjs/solid- Universal: writecustom renderersto use Solid anywhere - A growing community and ecosystem with active core team support Quick Start You can get started with a simple app by running the following in your terminal: ```sh >npxdegitsolidjs/templates/jsmy-app https://www.tkcnn.com/github/solidjs/solid.html
5.solidimport { HTMLElements, SVGElements } from "solid-js/web"; let solidConfig = { moduleName: "solid-js/web", // @ts-ignore generate: "dynamic", renderers: [ { name: "dom", moduleName: "solid-js/web", elements: [HTMLElements, SVGElements] }, { name: "universal", modulehttps://classic.yarnpkg.com/en/package/solid-js
6.SolidJS简介javascript开源小助理作者:Iniubong Obonguko 简介 SolidJS 是不断增长的 JavaScript 框架列表中的新成员。但这不仅仅是您常规的日常框架。 SolidJS 有一些非常有趣的特性,它们给竞争带来了激烈的竞争。 SolidJS 框架由Ryan Carniato创建并于 2018 年开源,但最近凭借其“细粒度反应性”的卖点获得了一些人气。 SolidJS 与 Rehttps://devpress.csdn.net/opensource/62f41f817e6682346618805c.html
7.SolidThe tag for Solid, a JavaScript framework for building performant user interfaces. Create Post about #solidjs Solid is a declarative JavaScript library for creating user interfaces. It does not use a Virtual DOM. Instead, it opts to compile its templates down to real DOM nodes and wrap http://dev.to/t/solidjs
8.solidjsAlova.JSFramework solidjs版本:v2 solidjs alova@3.2.0+ 已支持该功能,请参考 alova@3 solid 适配器 编辑此页 上一页 vue2/3 options 下一页 angular 文档 文档 示例 API 贡献指南 资源 请求适配器 存储适配器 框架支持 社区 Discord X Wechat Group 更多 GitHub Issues Pull request https://alova.js.org/zh-CN/v2/tutorial/framework/solid/
9.Solid.js基础前端程序员import { createEffect, createMemo, createSignal, Show } from 'solid-js'; export default function Hello() { const [count, setCount] = createSignal(0); createEffect(() => { // 副作用 console.log('count = ', count()); }); const handleClick = (e: Event) => { setCount(count()https://xdyuan.cn/solidjsbasic/
10.Let'sLearnSolidJSSolidJS is an exciting framework with a small (6.4kb) footprint, a reactive, component-based approach, and incredible performance. In this episode, Ryan Carniato will teach us how to get started with our first SolidJS app!https://www.learnwithjason.dev/lets-learn-solid-js/
11.Solidjs基础教程npx degit solidjs/templates/js my-app cd my-app npm i npm run dev 基本示例 这里将 App 组件渲染到 body 容器中 这里修改默认示例, 从零开始尝试 // App.JSXimport{render}from"solid-js/web";functionApp(){return(Solid My App);}// 组件声明也可以直接用箭头函数/* const App = https://www.jianshu.com/p/801feffa07e0
12.新星SolidJS/Svelte/Lit对比前端架构设计虽然SolidJS 很棒,但相关组件生态还没有起来,巨大的迁移成本是它难以快速替换到生产环境的最大问题。前端生态想要无缝升级,看来第一步是想好 “代码范式”,以及代码范式间如何转换,确定了范式后再由社区竞争完成实现,就不会遇到生态难以迁移的问题了。 https://www.zhoulujun.cn/html/webfront/engineer/Architecture/9171.html
13.基于JavaScript介绍性能爆表的SolidJSReact对数据的处理是不可变(immutable):具体表现是整树更新,更新时,不关注是具体哪个状态变化了,只要有状态改变,直接整树diff找出差异进行对应更新。Vue对数据的处理是响应式、可变的(mutable):更新时,能够精确知道是哪些状态发生了改变,能够实现精确到节点级别的更新(类似的框架还有Svelte、SolidJS)。 https://www.inte.net/news/260723.html
14.100秒学会solidjs51CTO学堂JSReactSOLIDjavascript库函数组件编译器typescript响应状态生命周期钩子条件逻辑服务器端渲染延迟加载 SOLID是一种专注于用户界面构建的JavaScript库,因其出色的性能和简洁的设计而受到开发者青睐。与其他框架如React不同,SOLID没有采用虚拟DOM,而是采用编译器直接转换,利用TypeScript简化直接操作DOM的过程。其响应式函数组件https://edu.51cto.com/video/2934.html
15.JSRoundup:Episode01TheWebStormBlogSolid.js support. Remember SolidJS, which I just mentioned? Now you can use Solid.js components in Astro There’s also Lit support for using Lit SSR to get server-side rendering for web components There’ssupport, GitHub syntax highlighting, and a shiny new docs site You’ll find http://blog.jetbrains.com/webstorm/2021/08/js-roundup-episode-01/
16.SolidJs尝鲜与WebComponent实践造虚拟滚动的轮子按照这个设计思路做虚拟滚动时,滚动元素的高度必须是已知且固定的,不适用于列表元素高度自适应的情况,而这在移动端的列表很常见。后续有时间,我会思考如何处理自适应元素高度的虚拟滚动。 编译打包 项目中使用vite打包,通过solid可把代码转换为纯js: 将这段js代码再封装,改为web Component组件:https://developer.aliyun.com/article/833656
17.SolidJS·反应式JavaScript库闭包和钩子规则不仅在 Solid 中是不必要的:它们可以规定在这里不起作用的代码。 Vue 兼容包是可行的,尽管目前还没有实施它的计划。 另一方面,可以在 React 中运行 Solid。React Solid State 使Solid API 在 React 函数组件中可访问。reactjs-solidjs-bridge 允许您在 Solid 组件中渲染 React 组件,反之亦然,这https://www.solidjs.com/guides/faq
18.推荐一款简易的solidjs消息UI库使用详解vue.js这篇文章主要为大家介绍了推荐一款简易的solid-js消息UI库使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 solid-msg今天推荐一款简易的 solid-js 的消息 UIhttps://www.jb51.net/article/260936.htm
19.探索SolidJS和TanStackTable开发之旅在了解到自己负责的几个页面都是简单的表格展示后,决定选择solidjs和TanStack Table这个Headless UI 库。以下是为什么选择 SolidJS 的原因:语法和 React 相似:SolidJS 的语法和 React 很相似,这使得上手和迁移现有 React 组件相对容易,减少了学习成本。 小体积:SolidJS 体积小,这对于项目性能和加载速度是一个优势https://m.nowcoder.com/discuss/515549906778578944
20.比较前端框架ReactJsSolidJSSvelte和Lit底层逻辑这里是JSX(SolidJS和React)中的数据绑定。 function HelloWorld() { constname ="Solid or React"; return( Hello {name}! ) } Lit中Data-binding数据绑定 : classHelloWorldextendsLitElement { @property() name = 'lit'; render() { returnhtml`Hellohttps://www.jdon.com/59675.html
21.Vite是什么(并且为什么如此流行)?腾讯云开发者社区SolidStart: https://start.solidjs.com/ [6] Remix: https://remix.run/ [7] Evan You在ViteConf 2022上的主旨演讲: https://viteconf.org/23/replay/vite_keynote [8] Vite: https://vitejs.dev/guide/ [9] rollup: https://rollupjs.org/ https://cloud.tencent.com.cn/developer/article/2425368
22.JS框架性能对比:Solid高居榜首,VueReact和Angular竟纷纷跌还有一点需要提一下,我是 Solid Framework 的作者,因此我免不了会在文章中掺杂一些偏见。但我的打算是尽量让数字说话。了解过这些背景后,就请坐下来欣赏比赛吧。 比赛开始 我用的是 JS Framework Benchmark 中最新的 Chrome 87。它们是用一部安装 Fedora 33 系统的 Core i7 Razor Blade 15 测出来的,且缓解措https://www.infoq.cn/article/ebDcihIZbEZoFU9q6pi7
23.taro最近在深度使用tarojs-plugin-solid插件去写小程序的项目,发现了一些bug,也在仓库的issues中记录了下来,这2个bug的实质也算殊途同归,都是h函数出现了问题。 不过图片所示的问题更加严重,这会在父组件中props的signal更新时,带动子组件的全量更新,这明显是违背了solid更新的原则。 问题分析 上菜: import { View, https://www.pipipi.net/40952.html/amp