Comments (3)
@errorrik 能给点建议思路吗?
from san.
没必要。你要解决的是状态保存的问题。
看起来这个状态和 parent 和 owner 都无关,看起来这个粒度是 by 组件的,是自己组件内聚的。以及,我不确定你是依赖某个父环境存在,还是出现在任何地方都需要保持之前的状态。这是你需要考虑的问题,这些问题框架并不帮你解决,KeepAlive 是一个无脑封装
我还是建议自己封装解决。下面是我的一个思路,场景是,在某个爹一直存活的生命周期内,状态能被保存。但这不一定适应你的状态保存场景,仅供参考。
function keepAlive(Component) {
let key = (new Date).getTime() + Math.random();
let initData = Component.prototype.initData;
let attached = Component.prototype.attached;
let proto = {
initData() {
if (this.owner && this.owner.__keepAlive && this.owner.__keepAlive[key]) {
return this.owner.__keepAlive[key];
}
return initData.call(this);
},
attached() {
this.data.listen(change => {
if (this.owner) {
if (!this.owner.__keepAlive) {
this.owner.__keepAlive = {};
}
this.owner.__keepAlive[key] = this.data.get();
}
});
attached && attached.call(this);
}
}
return san.defineComponent(proto, Component);
}
const ManualCounter = san.defineComponent({
template: '<div>{{count}}<button on-click="add">+</button></div>',
add() {
this.d.count++;
},
initData() {
return {
count: 0
};
}
});
const AutoCounter = san.defineComponent({
template: '<div>{{count}}</div>',
attached() {
this.interval = setInterval(() => {
this.d.count++;
}, 1000)
},
detached() {
clearInterval(this.interval);
},
initData() {
return {
count: 0
};
}
});
const Entry = san.defineComponent({
components: {
'c-manual': keepAlive(ManualCounter),
'c-auto': keepAlive(AutoCounter)
},
template: `
<div>
<input type="radio" value="c-manual" checked="{= counter =}" name="counter">manual
<input type="radio" value="c-auto" checked="{= counter =}" name="counter">auto
<c s-is="counter" />
</div>
`,
initData() {
return {
counter: 'c-manual'
};
}
});
(new Entry).attach(document.body)
from san.
我的需求就是想在打开多个选项卡时,在已经打开的选项卡之间切换时需要保持状态,这些选项卡是通过 san-router 来打开的,上面的代码能够实现初始化数据的状态保持,但是在切换的时候还是会执行 attached 方法,这样就会调用后台方法获取数据,能否实现不去重新调用后端方法加载数据呢?
from san.
Related Issues (20)
- 关于调试源码过程中 Data.prototype.splice 方法中的一点疑惑 HOT 2
- san-ssr 可以支持sourcemap吗?
- 有为 vite 提供 san 单文件组件支持的插件吗?
- 在特定情况下created内的数据操作不生效 HOT 2
- 如何使用typescript定义s-ref的类型? HOT 1
- 引入svg标签linearGradient报错
- san支持动态组件吗? HOT 1
- lint: 模板指令是否有推荐的编码规范 HOT 1
- 移除 IE 的支持 HOT 1
- HTML模板可以支持JSX吗 HOT 1
- 条件渲染时,只给其中一个分支标记具名插槽,但其他分支也会被渲染进该具名插槽 HOT 1
- san反解遍历子元素,会移除由空格或换行组成的文本节点,造成页面抖动 HOT 1
- Example中webpack-cli依赖需更新 HOT 1
- 关于组件的 attribute 透传 HOT 46
- San使用SSR之后和未使用SSR的San项目父子组件生命周期执行顺序不一样是设定好的嘛? HOT 1
- 给自定义组件属性绑定值的问题,谢谢 HOT 10
- 为什么 this.el 返回的是一个注释节点呢? HOT 2
- {{sankit}}是不是已经在开发了?【Featured】
- 在一个组件中定义了一个默认插槽和两个命名插槽,在该组件内部如何判断默认插槽是否有传入值?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from san.