@fane_the_divine/react-signal 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,22 +1,18 @@
1
1
  # react-signal
2
2
 
3
- 在react里使用signal, API参考solid,使用方法见[demo](src/index.tsx).
3
+ 在react里使用signal
4
4
 
5
- ## API介绍
5
+ API参考solid,使用方法见[demo](src/index.tsx).
6
6
 
7
- ### defineComponent
7
+ [npm包](https://www.npmjs.com/package/@fane_the_divine/react-signal)
8
8
 
9
- ```tsx
10
- type CompProps = {
11
- num: number
12
- }
13
- const Comp = defineComponent<CompProps>((props) => {
14
- return () => <span>{props().num}</span>
15
- })
9
+ ```bash
10
+ npm i @fane_the_divine/react-signal
16
11
  ```
17
12
 
18
- defineComponent接受一个setup函数 这个函数在组件整个生命周期内只执行一次(不包括热重载)
19
- setup应当返回一个render函数 这个函数会执行多次
13
+ 使用时可能出现hmr失效的问题,需要重建组件或刷新网页
14
+
15
+ ## API介绍
20
16
 
21
17
  ### createSignal
22
18
 
@@ -34,6 +30,21 @@ count.value
34
30
 
35
31
  可以在任何位置使用createSignal
36
32
 
33
+ ### defineComponent
34
+
35
+ ```tsx
36
+ type CompProps = {
37
+ num: () => number
38
+ }
39
+ const Comp = defineComponent<CompProps>((props) => {
40
+ // props对象是signal 参数也是signal
41
+ return () => <span>{props().num()}</span>
42
+ })
43
+ ```
44
+
45
+ defineComponent接受一个setup函数 这个函数在组件整个生命周期内只执行一次
46
+ setup应当返回一个render函数 这个函数会执行多次
47
+
37
48
  ### createMemo
38
49
 
39
50
  创建一个派生signal
@@ -42,7 +53,7 @@ count.value
42
53
  // 参数为上一次的memo值
43
54
  const double = createMemo((prev) => {
44
55
  return count() * 2
45
- // 第二个参数是自定义的比较眼熟
56
+ // 第二个参数是自定义的比较函数
46
57
  }, Object.is)
47
58
 
48
59
  // 访问其值
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react");let h;const y=()=>h;function E(o,t){const u=h;h=t;const s=o();return h=u,s}let p;const m=()=>p;function S(o,t){const u=p;p=t;const s=o();return p=u,s}function C(o){let t=o;const u=new Set;function s(){const n=y();return n&&!u.has(n)&&(u.add(n),n.listenRangeDestory(()=>u.delete(n))),t}Object.defineProperty(s,"value",{get(){return t}});function e(n){t!==n&&(t=n,u.forEach(l=>l.onSignalChange()))}return[s,e]}function v(o){const t=u=>{const[,s]=d.useReducer(()=>({}),null),e=d.useRef(null);if(e.current)e.current.propsSignal[1](u);else{const r={onSignalChange:()=>{var i;(i=e.current)!=null&&i.isRending||s()},listenRangeDestory:i=>{var c;(c=e.current)==null||c.cleanups.push(i)}},f={addEffectFn:i=>{var c;return(c=e.current)==null?void 0:c.effects.push(i)},addLayoutEffectFn:i=>{var c;return(c=e.current)==null?void 0:c.layoutEffects.push(i)}},g=C(u);e.current={reactivityRange:r,componentRange:f,cleanups:[],effects:[],layoutEffects:[],isRending:!1,propsSignal:g};const a=E(()=>S(()=>o(g[0]),f),r);e.current.render=a}d.useEffect(()=>()=>{if(!e.current)return;const r=e.current.cleanups;e.current=null,r.forEach(f=>f())},[]),d.useLayoutEffect(()=>{if(!e.current)return;const r=e.current.effects;e.current.effects=[],r.forEach(f=>f())}),d.useEffect(()=>{if(!e.current)return;const r=e.current.layoutEffects;e.current.layoutEffects=[],r.forEach(f=>f())});const{render:n,reactivityRange:l}=e.current;e.current.isRending=!0;const R=E(n,l);return e.current.isRending=!1,R};return d.memo(t)}function D(o,t,u){let s=[];function e(){s.forEach(c=>c()),s=[]}const n=y();n==null||n.listenRangeDestory(e);let l;const R={onSignalChange:()=>{f=!0},listenRangeDestory:c=>{s.push(c)}},r=m();let f=!0,g=!0;function a(){const{layoutEffect:c}=u??{};c?r==null||r.addLayoutEffectFn(i):r==null||r.addEffectFn(i)}function i(){a(),f&&(f=!1,e(),E(()=>{t==null||t.forEach(c=>c()),l=o(l,g),g=!1},R))}a()}function F(o,t=Object.is){let u=[];function s(){u.forEach(a=>a()),u=[]}const e=y();e==null||e.listenRangeDestory(s);let n,l=!0;const R={onSignalChange:()=>{l=!0},listenRangeDestory:a=>{u.push(a)}},r=new Set;function f(a=!0){if(!l)return;s();const i=n;E(()=>{n=o(i)},R),l=!1,!(!a||t(i,n))&&r.forEach(c=>c.onSignalChange())}function g(){f();const a=y();return a&&!r.has(a)&&(r.add(a),a.listenRangeDestory(()=>r.delete(a))),n}return Object.defineProperty(g,"value",{get(){return f(!1),n}}),g}function b(o){const t=y();t==null||t.listenRangeDestory(()=>E(o,void 0))}function M(o){return{current:o??null}}exports.createEffect=D;exports.createMemo=F;exports.createRef=M;exports.createSignal=C;exports.defineComponent=v;exports.onCleanup=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react");let h;const y=()=>h;function E(o,t){const u=h;h=t;const s=o();return h=u,s}let p;const m=()=>p;function S(o,t){const u=p;p=t;const s=o();return p=u,s}function C(o){let t=o;const u=new Set;function s(){const n=y();return n&&!u.has(n)&&(u.add(n),n.listenRangeDestory(()=>u.delete(n))),t}Object.defineProperty(s,"value",{get(){return t}});function e(n){t!==n&&(t=n,u.forEach(l=>l.onSignalChange()))}return[s,e]}function v(o){const t=u=>{const[,s]=d.useReducer(()=>({}),null),e=d.useRef(null);if(e.current)e.current.propsSignal[1](u);else{const r={onSignalChange:()=>{var i;(i=e.current)!=null&&i.isRending||s()},listenRangeDestory:i=>{var c;(c=e.current)==null||c.cleanups.push(i)}},f={addEffectFn:i=>{var c;return(c=e.current)==null?void 0:c.effects.push(i)},addLayoutEffectFn:i=>{var c;return(c=e.current)==null?void 0:c.layoutEffects.push(i)}},g=C(u);e.current={reactivityRange:r,componentRange:f,cleanups:[],effects:[],layoutEffects:[],isRending:!1,propsSignal:g};const a=E(()=>S(()=>o(g[0]),f),r);e.current.render=a}d.useEffect(()=>()=>{if(!e.current)return;const r=e.current.cleanups;e.current=null,r.forEach(f=>f())},[]),d.useLayoutEffect(()=>{if(!e.current)return;const r=e.current.layoutEffects;e.current.layoutEffects=[],r.forEach(f=>f())}),d.useEffect(()=>{if(!e.current)return;const r=e.current.effects;e.current.effects=[],r.forEach(f=>f())});const{render:n,reactivityRange:l}=e.current;e.current.isRending=!0;const R=E(n,l);return e.current.isRending=!1,R};return d.memo(t)}function D(o,t,u){let s=[];function e(){s.forEach(c=>c()),s=[]}const n=y();n==null||n.listenRangeDestory(e);let l;const R={onSignalChange:()=>{f=!0},listenRangeDestory:c=>{s.push(c)}},r=m();let f=!0,g=!0;function a(){const{layoutEffect:c}=u??{};c?r==null||r.addLayoutEffectFn(i):r==null||r.addEffectFn(i)}function i(){a(),f&&(f=!1,e(),E(()=>{t==null||t.forEach(c=>c()),l=o(l,g),g=!1},R))}a()}function F(o,t=Object.is){let u=[];function s(){u.forEach(a=>a()),u=[]}const e=y();e==null||e.listenRangeDestory(s);let n,l=!0;const R={onSignalChange:()=>{l=!0},listenRangeDestory:a=>{u.push(a)}},r=new Set;function f(a=!0){if(!l)return;s();const i=n;E(()=>{n=o(i)},R),l=!1,!(!a||t(i,n))&&r.forEach(c=>c.onSignalChange())}function g(){f();const a=y();return a&&!r.has(a)&&(r.add(a),a.listenRangeDestory(()=>r.delete(a))),n}return Object.defineProperty(g,"value",{get(){return f(!1),n}}),g}function b(o){const t=y();t==null||t.listenRangeDestory(()=>E(o,void 0))}function M(o){return{current:o??null}}exports.createEffect=D;exports.createMemo=F;exports.createRef=M;exports.createSignal=C;exports.defineComponent=v;exports.onCleanup=b;
@@ -11,6 +11,9 @@ import { RefObject } from 'react';
11
11
  * @example
12
12
  * ```ts
13
13
  * defineComponent(() => {
14
+ *
15
+ * // ...
16
+ *
14
17
  * createEffect(
15
18
  * // 允许 effect 函数返回一个值,并会输入到下一次 effect 函数
16
19
  * // 可以从参数判断是否第一次调用
@@ -31,7 +34,8 @@ import { RefObject } from 'react';
31
34
  * },
32
35
  * )
33
36
  *
34
- * return () => null
37
+ * // ...
38
+ *
35
39
  * })
36
40
  * ```
37
41
  */
@@ -76,21 +80,19 @@ export declare function createSignal<T>(defaultValue: T): Signal<T>;
76
80
  * setup 在组件整个生命周期内只执行一次(不包括热重载),应返回一个 render 函数;render 会执行多次。
77
81
  * 入参 `props` 为 {@link SignalGetter},在 setup 或 render 中用 `props()` 读取并追踪父组件传入的 props。
78
82
  *
79
- * @typeParam T - 组件 props 类型。
80
- *
81
- *
82
83
  * @example
83
84
  * ```tsx
84
85
  * type CompProps = {
85
- * num: number
86
+ * // 组件参数可以是signal
87
+ * num: () => number
86
88
  * }
87
89
  * const Comp = defineComponent<CompProps>((props) => {
88
- * // props也是signal
90
+ * // props对象是signal
89
91
  * // 组件销毁后执行
90
92
  * onCleanup(()=> console.log('comp unmounted'))
91
93
  * // render中用到的signal被自动收集 变化后更新组件
92
- * // 如果通过.value访问值 则不会被收集
93
- * return () => <span>{props().num}</span>
94
+ * // 如果通过props().num.value访问值 则不会被收集
95
+ * return () => <span>{props().num()}</span>
94
96
  * })
95
97
  * ```
96
98
  */
@@ -77,13 +77,13 @@ function L(a) {
77
77
  const n = e.current.cleanups;
78
78
  e.current = null, n.forEach((f) => f());
79
79
  }, []), S(() => {
80
- if (!e.current) return;
81
- const n = e.current.effects;
82
- e.current.effects = [], n.forEach((f) => f());
83
- }), p(() => {
84
80
  if (!e.current) return;
85
81
  const n = e.current.layoutEffects;
86
82
  e.current.layoutEffects = [], n.forEach((f) => f());
83
+ }), p(() => {
84
+ if (!e.current) return;
85
+ const n = e.current.effects;
86
+ e.current.effects = [], n.forEach((f) => f());
87
87
  });
88
88
  const { render: t, reactivityRange: l } = e.current;
89
89
  e.current.isRending = !0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fane_the_divine/react-signal",
3
- "version": "0.0.0",
3
+ "version": "0.0.2",
4
4
  "type": "module",
5
5
  "description": "在react中使用signal",
6
6
  "license": "MIT",