solid-alive 0.1.0 → 0.1.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/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/types/AliveProvider.d.ts +1 -1
- package/dist/types/AliveTransfer.d.ts +1 -1
- package/dist/types/default.d.ts +1 -1
- package/package.json +3 -3
- package/readme.md +13 -5
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("solid-js/web"),l=require("solid-js/store"),
|
|
1
|
+
"use strict";var e=require("solid-js/web"),l=require("solid-js/store"),t=require("solid-js"),o=t.createContext({elements:{},scrollDom:{current:null},closeSymbol:Symbol("close"),insertElement:()=>{},onDeactivated:()=>{},onActivated:()=>{},removeAliveElement:()=>{},saveScroll:()=>{},setCurrentComponentId:()=>{},saveElScroll:()=>{},resetElScroll:()=>!0,removeScrollEl:()=>!0});var r={appear:"index-module_appear__MaHzX",_appear:"index-module__appear__7KeRW",toLeft:"index-module_toLeft__s1PDL",_toLeft:"index-module__toLeft__SD-Zp"};let n=0,c=0;exports.AliveProvider=function(r){var[n,c]=l.createStore(),s={current:null};let a=Symbol("close"),i=a,d=new Map,v=new Map,u=new Map;var m=e=>{let l=e.id,t=d.get(l),o=v.get(l),r=u.get(l);d.delete(l),v.delete(l),u.delete(l),c([l],Object.assign(Object.assign({},e),{onActivated:t,onDeactivated:o,domList:r}))},f=e=>{var l;if(Reflect.has(n,e)){var t=null===(l=n[e])||void 0===l?void 0:l.children;null==t||t.forEach((l=>l!==e&&f(l))),c((l=>{var t,o,r,n;return null===(o=(t=l[e]).onDeactivated)||void 0===o||o.call(t),l[e].component=null,null===(n=(r=l[e]).dispose)||void 0===n||n.call(r),l[e].dispose=null,l[e].onActivated=null,l[e].onDeactivated=null,l[e].scroll=null,l[e].id="",l[e].children=null,l[e].domList=null,l[e]=null,delete l[e],l}))}},p=e=>{if(null==e)for(const e of Object.values(n))f(e.id);else f(e)},E=e=>{i=e},L=(e,t)=>{Reflect.has(n,e)&&c(l.produce((l=>{l[e].scroll=Object.assign({},t)})))},S=e=>{i!==a&&d.set(i,e)},h=e=>{i!==a&&v.set(i,e)},A=(e,l)=>{var t,o;if(i!==a){var r=(null!==(t=u.get(i))&&void 0!==t?t:new Map([])).set(e,{top:0,left:0});u.set(i,r),null===(o=null==l?void 0:l())||void 0===o||o(e)}},D=e=>{var l;for(const t of Object.values(n))if(null===(l=t.domList)||void 0===l?void 0:l.has(e))return t.domList.delete(e),e.scrollTop=0,e.scrollLeft=0,!0;return!1},_=e=>{var l;for(const t of Object.values(n))if(null===(l=t.domList)||void 0===l?void 0:l.has(e))return t.domList.set(e,{top:0,left:0}),e.scrollTop=0,e.scrollLeft=0,!0;return!1};return t.createEffect((()=>{r.scrollId&&(s.current=document.getElementById(r.scrollId),!s.current&&console.error(`[solid-alive] scrollId: ${r.scrollId} is null `))})),e.createComponent(o.Provider,{get value(){return{scrollDom:s,behavior:r.behavior,transitionEnterName:r.transitionEnterName,elements:n,closeSymbol:a,onActivated:S,onDeactivated:h,insertElement:m,saveScroll:L,removeAliveElement:p,setCurrentComponentId:E,saveElScroll:A,resetElScroll:_,removeScrollEl:D}},get children(){return r.children}})},exports.AliveTransfer=function(l,s,a){var i,{behavior:d,elements:v,scrollDom:u,closeSymbol:m,transitionEnterName:f,insertElement:p,saveScroll:E,setCurrentComponentId:L}=t.useContext(o);Reflect.has(v,s)||(L(s),t.createRoot((t=>{p({id:s,dispose:t,component:e.createComponent(l,{}),onDeactivated:null,onActivated:null,scroll:{top:0,left:0},children:Array.isArray(a)?a:null,domList:null})})));var S=e=>{var l;if(u.current)if("cacheScroll"===e){var t="alwaysTop"===d?{top:0,left:0}:{top:u.current.scrollTop,left:u.current.scrollLeft};E(s,t)}else{var o=Date.now();if(o-n>200){const{top:e=0,left:t=0}=(null===(l=v[s])||void 0===l?void 0:l.scroll)||{};u.current.scrollTop=e,u.current.scrollLeft=t,n=o}}};if(f&&Date.now()-c>200){c=Date.now();let e=null===(i=v[s])||void 0===i?void 0:i.component;if("function"==typeof e&&(e=null==e?void 0:e()),e instanceof HTMLElement){var h=r[f]||f;e.classList.add(h);const l=()=>{e.classList.remove(h),e.removeEventListener("animationend",l)};e.addEventListener("animationend",l)}}return t.createEffect((()=>{var e,l,t;null===(l=(e=v[s]).onActivated)||void 0===l||l.call(e),S("scrollTo"),null===(t=v[s].domList)||void 0===t||t.forEach(((e,l)=>{l.scrollTop=e.top,l.scrollLeft=e.left}))})),t.onCleanup((()=>{var e,l,t;L(m),null===(l=(e=v[s]).onDeactivated)||void 0===l||l.call(e),S("cacheScroll"),null===(t=v[s].domList)||void 0===t||t.forEach(((e,l,t)=>t.set(l,{top:l.scrollTop,left:l.scrollLeft})))})),v[s].component},exports.useAlive=function(){var{onActivated:e,onDeactivated:l,removeAliveElement:r,saveElScroll:n,resetElScroll:c,removeScrollEl:s}=t.useContext(o);return{onActivated:e,onDeactivated:l,removeAliveElement:r,directiveSaveScroll:n,resetElScroll:c,removeScrollEl:s}};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createComponent as e}from"solid-js/web";import{createStore as l,produce as o}from"solid-js/store";import{createContext as t,
|
|
1
|
+
import{createComponent as e}from"solid-js/web";import{createStore as l,produce as o}from"solid-js/store";import{createContext as t,createEffect as r,useContext as n,createRoot as i,onCleanup as c}from"solid-js";var s=t({elements:{},scrollDom:{current:null},closeSymbol:Symbol("close"),insertElement:()=>{},onDeactivated:()=>{},onActivated:()=>{},removeAliveElement:()=>{},saveScroll:()=>{},setCurrentComponentId:()=>{},saveElScroll:()=>{},resetElScroll:()=>!0,removeScrollEl:()=>!0});function a(t){var[n,i]=l(),c={current:null};let a=Symbol("close"),d=a,v=new Map,u=new Map,m=new Map;var f=e=>{let l=e.id,o=v.get(l),t=u.get(l),r=m.get(l);v.delete(l),u.delete(l),m.delete(l),i([l],Object.assign(Object.assign({},e),{onActivated:o,onDeactivated:t,domList:r}))},p=e=>{var l;if(Reflect.has(n,e)){var o=null===(l=n[e])||void 0===l?void 0:l.children;null==o||o.forEach((l=>l!==e&&p(l))),i((l=>{var o,t,r,n;return null===(t=(o=l[e]).onDeactivated)||void 0===t||t.call(o),l[e].component=null,null===(n=(r=l[e]).dispose)||void 0===n||n.call(r),l[e].dispose=null,l[e].onActivated=null,l[e].onDeactivated=null,l[e].scroll=null,l[e].id="",l[e].children=null,l[e].domList=null,l[e]=null,delete l[e],l}))}},E=e=>{if(null==e)for(const e of Object.values(n))p(e.id);else p(e)},L=e=>{d=e},S=(e,l)=>{Reflect.has(n,e)&&i(o((o=>{o[e].scroll=Object.assign({},l)})))},h=e=>{d!==a&&v.set(d,e)},D=e=>{d!==a&&u.set(d,e)},_=(e,l)=>{var o,t;if(d!==a){var r=(null!==(o=m.get(d))&&void 0!==o?o:new Map([])).set(e,{top:0,left:0});m.set(d,r),null===(t=null==l?void 0:l())||void 0===t||t(e)}},b=e=>{var l;for(const o of Object.values(n))if(null===(l=o.domList)||void 0===l?void 0:l.has(e))return o.domList.delete(e),e.scrollTop=0,e.scrollLeft=0,!0;return!1},A=e=>{var l;for(const o of Object.values(n))if(null===(l=o.domList)||void 0===l?void 0:l.has(e))return o.domList.set(e,{top:0,left:0}),e.scrollTop=0,e.scrollLeft=0,!0;return!1};return r((()=>{t.scrollId&&(c.current=document.getElementById(t.scrollId),!c.current&&console.error(`[solid-alive] scrollId: ${t.scrollId} is null `))})),e(s.Provider,{get value(){return{scrollDom:c,behavior:t.behavior,transitionEnterName:t.transitionEnterName,elements:n,closeSymbol:a,onActivated:h,onDeactivated:D,insertElement:f,saveScroll:S,removeAliveElement:E,setCurrentComponentId:L,saveElScroll:_,resetElScroll:A,removeScrollEl:b}},get children(){return t.children}})}var d={appear:"index-module_appear__MaHzX",_appear:"index-module__appear__7KeRW",toLeft:"index-module_toLeft__s1PDL",_toLeft:"index-module__toLeft__SD-Zp"};let v=0,u=0;function m(l,o,t){var a,{behavior:m,elements:f,scrollDom:p,closeSymbol:E,transitionEnterName:L,insertElement:S,saveScroll:h,setCurrentComponentId:D}=n(s);Reflect.has(f,o)||(D(o),i((r=>{S({id:o,dispose:r,component:e(l,{}),onDeactivated:null,onActivated:null,scroll:{top:0,left:0},children:Array.isArray(t)?t:null,domList:null})})));var _=e=>{var l;if(p.current)if("cacheScroll"===e){var t="alwaysTop"===m?{top:0,left:0}:{top:p.current.scrollTop,left:p.current.scrollLeft};h(o,t)}else{var r=Date.now();if(r-v>200){const{top:e=0,left:t=0}=(null===(l=f[o])||void 0===l?void 0:l.scroll)||{};p.current.scrollTop=e,p.current.scrollLeft=t,v=r}}};if(L&&Date.now()-u>200){u=Date.now();let e=null===(a=f[o])||void 0===a?void 0:a.component;if("function"==typeof e&&(e=null==e?void 0:e()),e instanceof HTMLElement){var b=d[L]||L;e.classList.add(b);const l=()=>{e.classList.remove(b),e.removeEventListener("animationend",l)};e.addEventListener("animationend",l)}}return r((()=>{var e,l,t;null===(l=(e=f[o]).onActivated)||void 0===l||l.call(e),_("scrollTo"),null===(t=f[o].domList)||void 0===t||t.forEach(((e,l)=>{l.scrollTop=e.top,l.scrollLeft=e.left}))})),c((()=>{var e,l,t;D(E),null===(l=(e=f[o]).onDeactivated)||void 0===l||l.call(e),_("cacheScroll"),null===(t=f[o].domList)||void 0===t||t.forEach(((e,l,o)=>o.set(l,{top:l.scrollTop,left:l.scrollLeft})))})),f[o].component}function f(){var{onActivated:e,onDeactivated:l,removeAliveElement:o,saveElScroll:t,resetElScroll:r,removeScrollEl:i}=n(s);return{onActivated:e,onDeactivated:l,removeAliveElement:o,directiveSaveScroll:t,resetElScroll:r,removeScrollEl:i}}export{a as AliveProvider,m as AliveTransfer,f as useAlive};
|
|
@@ -4,6 +4,6 @@ import { ProveiderProps } from './default';
|
|
|
4
4
|
* @param children jsx.element
|
|
5
5
|
* @param { string } [scrollId] id,如 'root' 会在切换组件时的动作,默认saveScrollTop
|
|
6
6
|
* @param { 'alwaysTop'|'saveScroll' } [behavior] dom元素滚动条会如何保持
|
|
7
|
-
* @param { 'appear'|'toLeft'
|
|
7
|
+
* @param { 'appear'|'toLeft' } [transitionEnterName] 路由切换动画, 可以自己加
|
|
8
8
|
*/
|
|
9
9
|
export default function AliveProvider(props: ProveiderProps): import("solid-js").JSX.Element;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { JSX } from 'solid-js';
|
|
2
2
|
/**
|
|
3
3
|
* @description Alive 组件用的 转换函数
|
|
4
|
-
* @param {
|
|
4
|
+
* @param { ()=> JSX.Element } Componet,
|
|
5
5
|
* @param { string } id string,自己的id 值,一定要唯一
|
|
6
6
|
* @param { Array<string> } [children] [string,...], 子组件的 id值 可不传,这样默认销毁时不会去干掉子组件,
|
|
7
7
|
*/
|
package/dist/types/default.d.ts
CHANGED
|
@@ -21,7 +21,6 @@ export interface ProveiderProps extends pub {
|
|
|
21
21
|
export interface NodeInfo {
|
|
22
22
|
id: string
|
|
23
23
|
component: JSX.Element
|
|
24
|
-
owner: Owner | null
|
|
25
24
|
scroll: {top:number,left:number} | null
|
|
26
25
|
domList: Map<Element, {top:number,left:number }> | null
|
|
27
26
|
children?: Array<string> | null
|
|
@@ -36,6 +35,7 @@ export interface StoreProps {
|
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
export interface ContextProps extends pub {
|
|
38
|
+
scrollDom:{current:Element | null},
|
|
39
39
|
elements: StoreProps
|
|
40
40
|
closeSymbol: symbol
|
|
41
41
|
insertElement: (d: NodeInfo) => void
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "solid-alive",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"author": "1iuxs",
|
|
4
5
|
"description": "solid-alive",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "dist/index.cjs",
|
|
@@ -27,9 +28,8 @@
|
|
|
27
28
|
],
|
|
28
29
|
"repository": {
|
|
29
30
|
"type": "git",
|
|
30
|
-
"url": "https://
|
|
31
|
+
"url": "https://github.com/iuxs/solid-alive"
|
|
31
32
|
},
|
|
32
|
-
"author": "iuxs",
|
|
33
33
|
"license": "ISC",
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"solid-js": "^1.8.16"
|
package/readme.md
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
## solid-alive
|
|
2
2
|
|
|
3
3
|
### 安装(install)
|
|
4
4
|
- pnpm add solid-alive / npm i solid-alive / yarn add solid-alive
|
|
5
5
|
### 描述(describe)
|
|
6
|
-
- 用于 solid 组件缓存,只测试过2
|
|
7
|
-
-
|
|
6
|
+
- 用于 solid 组件缓存,只测试过2级路由缓存, 有过渡动画, 可缓存组件内的滚动条
|
|
7
|
+
- AliveProvider
|
|
8
|
+
- scrollId : 想滚动的元素id, 我用的getElementById
|
|
9
|
+
- behavior : 想 scrollId 的滚动条是 alwaysTop / savaScroll
|
|
10
|
+
- transitionEnterName : 'appear'/ 'toLeft'/...., Customizable 路由切换 的过渡动画, 但要在 App中引入 样式, import 'solid-alive/dist/styles/style.css', 自定义的css要用 @keyframes 来定义动画
|
|
11
|
+
- 在 useAlive
|
|
8
12
|
- removeAliveElement: 函数, 可传一个参数, 不传就删除所有缓存 :
|
|
9
13
|
removeAliveElement('/home')
|
|
10
14
|
- onActivated / onDeactivated: 函数,只能传一个函数,多次调用只有最一个会调用.
|
|
11
15
|
onActivated(()=> console.log('actived'))
|
|
12
|
-
- directiveSaveScroll 保存滚动条指令, 不过能不用就不用,
|
|
13
|
-
-
|
|
16
|
+
- directiveSaveScroll: 保存滚动条指令, 不过能不用就不用, 但组件不能使用,只能标签!!!ref会拿不到dom
|
|
17
|
+
- resetElScroll : 重置元素的滚动条
|
|
18
|
+
- removeScrollEl : 删除元素在alive中保存的dom
|
|
14
19
|
- 子父 缓存/删除 问题
|
|
15
20
|
- 如果某组件下有子组件,在父的 AliveTransfer中,
|
|
16
21
|
第三个参数,为对象 写上子组件的唯一id: {children:['/childrenId','asf',...]}
|
|
@@ -24,6 +29,8 @@
|
|
|
24
29
|
import { render } from 'solid-js/web'
|
|
25
30
|
import App from './App'
|
|
26
31
|
import { AliveProvider } from 'solid-alive'
|
|
32
|
+
import 'solid-alive/dist/styles/style.css' // transition css,
|
|
33
|
+
|
|
27
34
|
const root = document.getElementById('root')
|
|
28
35
|
|
|
29
36
|
render(() =>
|
|
@@ -98,6 +105,7 @@ export default function Single() {
|
|
|
98
105
|
resetElScroll,
|
|
99
106
|
} = useAlive()
|
|
100
107
|
|
|
108
|
+
let divRef: Element | undefined = undefined
|
|
101
109
|
const click = () => {
|
|
102
110
|
removeAliveElement('/about') // delete '/about'; 删除 /about
|
|
103
111
|
// removeAliveElement() // delete all alive element; 会删除所有缓存的组件
|