我正在努力解决与RouterLink一起使用的Ionic的生命周期事件。
我将我的应用程序数据保存在一个JSON文件中,该文件在加载页面时使用url参数呈现每个项目。我需要按钮来转到下一个或上一个项目并刷新页面内容,即:
是否有任何方法/解决方法来重新加载组件并更新传递不同参数的状态?
我已经尝试使用useHistory挂钩,历史。replace(Source)和routerDirection=“back”,但它们都没有触发离子页面离开挂钩。我还尝试用Switch替换IonRouterOutlet,但这意味着没有一些重要的ionic功能。
提前谢谢!!
以下是代码摘录供参考:
讲座。json(对象数组)
{
"list" : [ {} ]
}
应用程序。tsx
<IonApp>
<IonReactRouter>
<IonSplitPane contentId="main">
<Menu />
<IonRouterOutlet id="main">
<Route path="/" exact>
<Redirect to="/lectures" />
</Route>
<Route path="/lectures" exact component={Home}></Route>
<Route path="/lectures/:name" exact>
<Lecture />
</Route>
</IonRouterOutlet>
</IonSplitPane>
</IonReactRouter>
</IonApp>
演讲tsx
const Page: React.FC = () => {
const [lecturaIndex, setLecturaIndex] = useState<number>(0);
const [btnLinks, setBtnLinks] = useState<{next?: string , prev?: string }>({});
useIonViewDidEnter(()=>{
// Gets page params and use them to find current item in data json
let current;
current = lectures.list.find(lecture => lecture.title === match.params.name);
setLecturaIndex(current.id);
// Set next and prev buttons url for routerLink
setBtnLinks({
next: current.id < 13 ? `/lectures/${languages.list[current.id+1].title}` : '/lectures',
prev: current.id > 0 ? `/lectures/${languages.list[current.id-1].title}` : '/lectures'
});
// function that Enables/disables navigation buttons depending on current index. ie: if i=0; can't go back
indexCheck(current);
})
// THESE ARE NEVER TRIGGERED WHEN GOING TO NEXT PARAM (/lectures/:param)
useIonViewWillLeave(()=>{
console.log('will leave lecture');
})
useIonViewDidLeave(()=>{
console.log('did leave lecture');
})
return(
<IonPage>
<IonContent>
<IonButton
disabled={nextBtnDisable}
routerLink={btnLinks.next}
routerDirection="back"
>
NEXT
</IonButton>
</IonContent>
</IonPage>
)
}
通常,依赖于路由匹配参数的useEffects
足以发出副作用,例如重新刻蚀相关数据。
这里描述的ionicuseIonViewWillEnter
和useIonViewddEnter
挂钩基本上是安装生命周期挂钩,如果您已经在视图上并且只更改URL路径参数,它们似乎不会触发。将逻辑移动到useEffects
挂钩,该挂钩在组件挂载及其任何指定依赖项更新时调用。
例子:
useEffect(() => {
// business logic to handle name param changes
}, [match.params.name]);
如果未定义匹配参数,则可以使用可选的链接操作符来防止空/未定义的对象访问。
useEffect(() => {
// business logic to handle name param changes
}, [match?.params?.name]);
似乎useIonViewWillEnter
和useIonViewddEnter
钩子也采用依赖数组并在内部实现useEffects
钩子。(以前应该多挖一点)
来源
export const useIonViewWillEnter = (callback: LifeCycleCallback, deps: any[] = []) => {
const context = useContext(IonLifeCycleContext);
const id = useRef<number | undefined>();
id.current = id.current || Math.floor(Math.random() * 1000000);
useEffect(() => {
callback.id = id.current!;
context.onIonViewWillEnter(callback);
}, deps);
};
export const useIonViewDidEnter = (callback: LifeCycleCallback, deps: any[] = []) => {
const context = useContext(IonLifeCycleContext);
const id = useRef<number | undefined>();
id.current = id.current || Math.floor(Math.random() * 1000000);
useEffect(() => {
callback.id = id.current!;
context.onIonViewDidEnter(callback);
}, deps);
};
那么就不需要使用效果挂钩了。
useIonViewDidEnter(() => {
// business logic to handle name param changes
}, [match?.params?.name]);
生命周期事件 There are two module lifecycle events OnModuleInit and OnModuleDestroy. You should use them for all the initialization stuff and avoid to work in the constructor. The constructor should only be
要了解Spring事件是否适合我正在处理的任务,我需要了解它们是如何工作的,它们存储在哪里?因为我可以猜测它们存储在Spring应用程序上下文中,如果应用程序崩溃则会消失,我的猜测正确吗?
主要内容:1. 需求阶段,2. 设计阶段,3. 建设/发展阶段,4. 测试阶段,5. 部署/交付阶段,6. 维护阶段软件开发生命周期(SDLC)是一个创建软件开发结构的过程。SDLC中有不同的阶段,每个阶段都有自己不同的活动。它使开发团队能够设计,创建和交付高质量的产品。 SDLC描述了软件开发的各个阶段和阶段的执行顺序。每个阶段都需要在软件开发的生命周期中从前一阶段交付。需求转化为设计,设计转化为开发和开发成测试,经过测试后提供给客户。 软件开发周期的不同阶段如下所示: 1. 需求阶段 这是开
注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch 在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa
我们大致为WebAPplication设计了4个生命周期: 请求初始化其实就是从URL中解析提取出{module}, {action}, {method}; 然后再根据{module}, {action}, {method}找到对应的Controller文件; 然后再调用对应的{method},完了之后再发送响应。当然响应的过程中肯定是要顺带着解析下模板标签啦。 恩,这就完了,貌似感觉很简单啊。
如下图. 可以看出,基本周期是: created mounted updated (update 可以理解成人肉手动操作触发) destroyed 上面步骤中的 1,3,4都是自动触发。 每个步骤都有对应的 beforeXyz方法 所以, 我们一般使用mounted 作为页面初始化时执行的方法