原文链接: >
生命周期钩子函数:指的是React组件在经过某些特殊的过程是会触发组件里面特定的方法,这里称为钩子函数(下面举三个常用的钩子函数)。
举几个简单例子:(具体全量的可以自行百度下,都有比较全面的介绍的)
componentWillMount: 挂载之前触发调用次函数,可以操作数据,此时还没有生成实际的DOM,处于VirtualDOM的状态。(这个状态可以做一些数据处理,查询、处理页面渲染需要的数据)
componentDidMount: 页面已经渲染完成,在网页上已经生成实际的DOM(此时可以操作页面的dom元素,documentgetElementById可以获取到具体的dom对象,比如获取canvas对象,加载echarts图面,都可以在这个函数里进行操作)
componentWillUnmount: 组件卸载之前触发这个方法。(在这里可以处理一些页面状态销毁的操作,例如clearTimeout等)
问得不清楚,所以不懂怎么回答这个区别。
所谓回调函数,一般就是把函数的地址作为参数传进去,让调用的函数在内部可以调用这个函数。
例子:
void
CALLBACK
fun(){}
这是一个函数,回调函数
void
AAA(int
a,
Fun
p);
这是一个普通函数,但第二个参数是fun
AAA(5,
fun);
钩子函数,严格算起来,也算是回调函数的一种。但钩子函数是针对的截取的,当你使用了钩子之后,每当触发到相对应的消息,系统就会先“执行你写的回调函数”。
即原本是:系统-->目标函数
使用钩子就变成:系统-->你写的回调函数-->目标函数
大概原理就是这样子。就不知道你对函数与钩子的了解水平如何了
RTT在空闲的时候可以使用钩子函数执行些简单的任务,例如LED闪烁之类的程序,利用这个功能我们可以做个工作状态指示灯
要使用钩子必须在配置里打开钩子的配置,在rt-configh里添加HOOK宏定义(如果没有的话)
#define
RT_USING_HOOK
然后在应用程序里设置钩子函数
#ifdef
RT_USING_HOOK
rt_thread_idle_sethook(rt_hw_led_flash);
#endif
下面就是该怎样实现这个函数了
void
rt_hw_led_flash(void)
{
rt_uint32_t
i;
rt_hw_led_init();
while
(1)
{
for(i
=
0;
i
<
2700000;
i++);
//500ms
GPIO_WriteBit(state_led_gpio,
state_led_pin,
(BitAction)(1-GPIO_ReadOutputDataBit(state_led_gpio,
state_led_pin)));
}
}
这样写过之后,在系统空闲的时候就会执行这个函数,当然,如果系统繁忙的时候是不会进入这个idel任务的,不过如果系统一直处于繁忙的状态就是有问题了
另外一点记住,在这个函数里不能调用系统提供的使线程挂起的函数
例如:
rt
thread
delay,
rt
sem
take
等
while
(1)
{
for(i
=
0;
i
<
2700000;
i++);
//500ms
GPIO_WriteBit(state_led_gpio,
state_led_pin,
(BitAction)(1-GPIO_ReadOutputDataBit(state_led_gpio,
state_led_pin)));
}
关键是这个while(1)没跳出的,所以全部在这里执行了。
好像还有同学对其中一些并不是完全清楚,所以继续解析下,当做结贴:
1
idle线程是系统中最后一道防线,它将是系统中,如果无其他事可干时的最后能够运行的线程。
--
所以idle线程不应该被阻塞。如果你有自己的线程能够成为这最后一道防线,那么这个限制将不存在。而对于一些原来系统中放在idle线程中做的工作(例如原来的最终的线程删除动作),在04x中,可以手工调用rt_thread_idle_excute函数来执行。
2
当系统空闲的时候,idle线程将执行这个钩子函数。
假设钩子函数一次运行会执行1ms,如果idle线程有机会运行200ms,那么钩子函数将被调用200次。
3
钩子函数运行时,不应该把idle线程总是纠结在这个函数中运行,必须要让idle线程有机会去运行rt_thread_idle_excute函数(因为还有一些事情等待idle线程去处理)。
--
所以在钩子函数中,不应该使用while(1);的方式。
while(1)
{
if
(
indicator
==
RT_TRUE)
{
do
something
}
else
delay(20ms)
}
这样那20ms会执行idle线程吧,问题是idle
20ms够吗,如果我改20ms为5ms呢
如果没有其他线程处理事务,将转换到idle线程去,通常idle线程中的系统任务会在0xx
ms以内执行完毕
①自定义指令是什么?以及自定义指令的使用场景
在Vue中,有很多内置指令,但是这些指令只能满足我们最基础的使用,当我们在实际项目中遇到了必须要对DOM进行操作的逻辑时,我们就用到了自定义指令
②自定义指令的钩子函数
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。
在父组件给子组件传值的时候,给子组件加一个判断,如果数据没有请求到就不渲染当前组件
vue-router传参两种方式:params和query
方法一:
query 方式传参和接收参数
传参:
接收参数:
this$routequeryid
传参是this$router,接收参数是this$route
两者区别:
$router为VueRouter实例,想要导航到不同URL,则使用$routerpush方法
$route为当前router跳转对象,里面可以获取name、path、query、params等
方法二:
params方式传参和接收参数
传参:
接收参数: this$routeparamsid
query和oarams的区别:
query相当于get请求,页面跳转的时候,可以在地址栏看到请求参数,而params相当于post请求,参数不会再地址栏中显示
全局导航钩子:beforeEach、afterEach
组件内导航:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave
独享导航守卫:beforeEnter
以上就是关于vue 钩子函数执行顺序全部的内容,包括:vue 钩子函数执行顺序、什么是react生命周期和生命周期钩子函数、回调函数 钩子函数 有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!