首页 > 其他分享 >[SolidJS] Build a simple version of reactivity

[SolidJS] Build a simple version of reactivity

时间:2023-01-24 04:33:06浏览次数:45  
标签:function const observer subscriptions simple reactivity SolidJS context fn

let context = []

function cleanup(observer) {
  for (const dep of observer.dependencies) {
    dep.delete(observer)
  }
}

function subscribe(observer, subscriptions) {
  subscriptions.add(observer)
  observer.dependencies.add(subscriptions)
}

function untrack(fn) {
  const prevContext = context
  context = []
  const res = fn()
  context = prevContext
  return res
}

function createSignal<T = any>(value: T) {
  const subscriptions = new Set()
  const read = () => {
    const observer = context[context.length - 1]
    if (observer) subscribe(observer, subscriptions)
    return value
  };
  const write = (newValue: any) => {
    value = newValue
    for (const observer of [...subscriptions]) {
      observer.execute()
    }
  };

  return [read, write];
}

function createEffect(fn: () => void) {
  const effect = {
    execute() {
      cleanup(effect)
      context.push(effect)
      fn()
      context.pop()
    },
    dependencies: new Set()
  }
  context.push({execute: fn})
  effect.execute()
}

function createMemo(fn) {
  const [singal, setSingal] = createSignal()
  createEffect(() => {
    setSingal(fn())
  })
  return singal
}

const [count, setCount] = createSignal(0);
const [count2, setCount2] = createSignal(2);
const [show, setShow] = createSignal(true);

const sum = createMemo(() => {
  return count() + count2()
})

createEffect(() => {
  console.log(untrack(() => count()))
  //console.log(count(), count2(), sum())
  // if (show()) console.log(count())
  // else console.log(count2())
})


setShow(false)
setCount(10)
setCount(20)

 

标签:function,const,observer,subscriptions,simple,reactivity,SolidJS,context,fn
From: https://www.cnblogs.com/Answer1215/p/17065314.html

相关文章

  • 【五期李伟平】CCF-A(CCS'21)Simple, Fast Malicious Multiparty Private Set Intersect
    OfriNevo,NiTrieuandAvishayYanai."Simple,FastMaliciousMultipartyPrivateSetIntersection."InProceedingsofthe2021ACMSIGSACConferenceonComp......
  • abc 232 F - Simple Operations on Sequence
    题意:求把数组a[]变成b[]的最小花费。有两种操作:花费\(X\)把任一元素\(+1/-1\)花费\(Y\)交换相邻的两个数\(n\le18\)思路:很帅的状压dp!看到\(n\le18\),......
  • VISUALBERT: A SIMPLE AND PERFORMANT BASELINE FOR VISION AND LANGUAGE论文阅读笔记
    摘要作者提出了VisualBERT这一框架,其由一系列的Transformerlayer组成,通过selfattention将文本与图像隐式地对齐,甚至对于语法关系也很敏感。方法VisualBERT方法的核心......
  • uni-app 使用uni-simple-router进行路由守卫
    //1.安装依赖//uni-read-pages适用于读取page.json文件中的路由信息[email protected]//2.配置与初始化//2.1根目录新建vue.c......
  • SimpleAdmin手摸手教学之:Redis缓存
    一、说明系统中有很多数据是不会经常修改的,但是读取的频率确很高,所以这时候就需要使用缓存将这些数据缓存起来。本系统采用Redis分布式缓存,将一些基本信息表缓存在内存中,......
  • SimpleAdmin手摸手教学之:请求代理
    一、前言在之前使用其他admin的时候,经常会有人再部署的时候会遇到这么一个问题:明明在生产环境中配置了后端的api地址,但是通过nginx部署之后,请求的确是本地的地址。这是因......
  • SimpleAdmin手摸手教学之:国密加密
    一、什么是国密加密二、国密实现本系统实现了国密SM2和SM4加解密,可以在SimpleAdmin.Core下的Utils->Cryptogram文件夹下找到。2.1SM2Sm2加解密需要配置公钥和私钥,在......
  • SimpleAdmin手摸手教学之:即时通讯
    一、前言作为前后端分离项目,前后端交互是一个非常重要的功能。目前主流框架都是通过Socket实现,本系统自然也是实现了基于Signalr的前后端交互,并在此基础上实现了基于MQTT......
  • [SWPUCTF 2018]SimplePHP
    [SWPUCTF2018]SimplePHP考点:1、PHP代码审计 2、Phar反序列化漏洞网站中有两个功能:查看文件和上传文件,利用查看文件将源码都先弄下来进行PHP代码审计。file.php<?php......
  • SimpleAdmin手摸手教学之:操作日志
    一、说明日志模块作为一个管理系统应该有的模块之一,在系统中有着举足轻重的作用,可以记录用户的操作记录和者系统异常,出现问题可以快速定位错误。在之前的系统开发中,我一般......