Vue3框架入门学习(二)声明式渲染实现一个页面定时器(理解Vue组件的data方法和mounted方法)

Vue3声明式渲染实战:实现页面定时器
本文介绍了如何在Vue3中通过声明式渲染实现一个页面定时器,详细解析了data方法和mounted方法的用途。在过程中遇到并解决了错误,包括删除多余引入文件和修正this指针问题,最终实现定时器的启动和停止功能。

昨天入门Vue3搞了一个HelloWorld玩玩,今天还是准备从官网的例子入手学习,不管什么框架,官网的例子和文档是最先要学习的。

Vue3的组件渲染方式应该有几种,最简单直观的一种组件渲染方式就是声明式渲染,说白了就是用html按照Vue的模板语法定义一个组件模板

上模板代码

<!--定义一个简单的html模板-->
<div id="counter">
  Counter: {{ counter }}
</div>

定义一个Vue组件

此处最重要的是要搞明白组件里的两个方法data()mounted(),data方法会被Vue框架在创建组件实例的过程中悄悄调用,data方法返回一个Json键值对对象,该对象会在组件的$data属性里也存一份。而mounted方法是Vue组件生命周期中的一个钩子方法,Vue组件生命周期除了mounted方法外还有beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、activated、deactivated、beforeUnmount、unmounted、errorCaptured、renderTracked、renderTriggered12个钩子方法。从名字上也能看得出来,这些钩子方法涵盖了一个Vue组件从开始创建到销毁的整个过程。

/*定义一个定时器组件*/
const CounterApp = {
  data(){
    return{
      counter: 0
    }
  },
  mounted(){
    setInterval( function(){
      this.counter++;
    }, 1000 );
  }
};
/*调用全局方法createApp创建一个Vue应用,并通过调用mount方法与id为counter的模板绑定*/
Vue.createApp( CounterApp ).mount( "#counter" );

运行一下,竟然报了一个错误,Uncaught TypeError: el.addEventListener is not a function

 

点开报错那一行的源码进去看了看,不是自己页面脚本的问题,然后又去Vue官网文档看了看,发现是多引入了一个vue.esm-browser-3.1.5.js,其实只要引入一个vue.global-3.1.5.js就好了

去掉vue.esm-browser-3.1.5.js后虽然不报错了,但是页面上的定时器却没有发生变化。于是加上万能断点alert语句调试一下

 

 结果弹出“[object HTMLDivElement]

没有办法只能使出最狠的一招了,直接查看官网例子的源代码,分析原因主要是有两个,一是应该在组件内给定时器定义一个变量,二是this指针传递有问题,修改一下

 

再运行一下,定时器可以正常工作了。

 

ok,再加个功能按钮,点一下停止定时器。这就涉及到Vue组件里的事件绑定了,查阅Vue官网文档后,得知可以通过v-on 指令 (通常缩写为 @ 符号) 来监听 DOM 事件,并在触发事件时执行一些 JavaScript。用法为 v-on:click="methodName" 或使用快捷方式 @click="methodName",还是蛮简单的,改一下代码

 

再运行调试一下,定时器正常工作,点击“停止定时器”按钮也能停止。搞定收工!

-------------------------简单分割线-------------------------

今天的代码已打包,需要的请自行下载,链接: https://pan.baidu.com/s/1GX1Qt3ocRWBaYxPDUSvlgw 提取码: nyyc

我的个人订阅号(大叔学前端/dashu_fe),感兴趣的可以关注下,谢谢!

 

 

<think>我们正在处理一个关于Vue.js的问题。用户想知道如何在Vuemounted生命周期钩子中按顺序同步执行两个方法。 根据引用[1],mounted钩子是创建期间的生命周期函数之一,此时已经将编译好的模板挂载到了页面指定的容器中显示。 在Vue中,生命周期钩子函数是同步执行的。也就是说,在mounted钩子中,我们写的代码默认是同步执行的(除非使用了异步函数)。 因此,如果两个方法都是同步的,那么直接顺序调用即可,它们会一个一个地执行。 但是,如果这两个方法中有异步操作(例如setTimeout、Promise、AJAX请求等),那么我们需要确保第方法在第一个方法完成之后执行。 这时,我们可以使用async/await或者Promise来处理。 根据用户的问题,他要求“同步执行”“按顺序”,所以我们需要考虑两种情况:方法都是同步的,或者方法中包含异步操作。 步骤: 1. 如果两个方法都是同步的,直接依次调用。 2. 如果方法中包含异步操作,我们需要将这两个方法写成返回Promise的函数,然后使用async/await来按顺序执行。 由于用户没有明确方法是否是异步的,我们给出两种情况的示例。 参考引用[1]中关于mounted钩子的说明,以及引用[2]中Vue实例的写法。 示例代码: 情况1:同步方法 ```javascript mounted() { this.method1(); this.method2(); // 会等到method1执行完再执行 } ``` 情况2:异步方法(假设method1内部有异步操作,我们希望等待其完成再执行method2) ```javascript methods: { method1() { return new Promise((resolve) => { // 模拟异步操作 setTimeout(() => { console.log(&#39;方法1完成&#39;); resolve(); }, 1000); }); }, method2() { console.log(&#39;方法2执行&#39;); } }, async mounted() { await this.method1(); this.method2(); } ``` 注意:在Vue中,mounted钩子可以是异步的(即使用async修饰),这样我们就可以在内部使用await。 但是,如果两个方法都是同步的,那么使用情况1的方式就足够了。 因此,根据用户的具体需求,如果方法是同步的,直接顺序调用;如果方法是异步的,则使用async/await。 另外,需要注意的是,在mounted钩子中,我们通常可以操作DOM,因为此时DOM已经挂载完成。 最后,我们生成相关问题。</think>在 Vue 的 `mounted` 生命周期钩子中按顺序同步执行两个方法,可以通过以下两种方式实现: ### 1. 直接顺序调用(适用于同步方法) 如果两个方法都是**同步操作**(无异步代码),直接在 `mounted` 中顺序调用即可: ```javascript mounted() { this.firstMethod(); // 先执行 this.secondMethod(); // 后执行(等待 firstMethod 完成) } ``` * **原理**:Vue 生命周期钩子默认同步执行,JavaScript 单线程特性保证顺序执行[^1]。 * **适用场景**:方法中只包含同步逻辑(如计算、DOM 操作等)。 ### 2. Async/Await(适用于异步方法) 如果方法中包含**异步操作**(如 API 请求、定时器),需使用 `async/await`: ```javascript async mounted() { await this.firstMethod(); // 等待异步操作完成 this.secondMethod(); // 随后执行 }, methods: { async firstMethod() { // 示例:等待 API 请求 const data = await fetch(&#39;/api/data&#39;); return data.json(); } } ``` * **关键点**: - 将 `mounted` 声明为 `async` - 在需等待的方法调用前加 `await` - 被调方法需返回 `Promise`(如 `async` 函数自动返回 Promise) * **注意**:若方法非异步,无需使用此方式。 ### 补充说明 1. **Vue 生命周期特性**:`mounted` 阶段 DOM 已渲染完成,适合执行 DOM 操作或初始化逻辑[^1]。 2. **错误处理**:异步操作中建议添加 `try/catch`: ```javascript async mounted() { try { await this.firstMethod(); this.secondMethod(); } catch (error) { console.error("执行失败:", error); } } ``` ### 示例场景 ```javascript export default { mounted() { this.initChart(); // 同步初始化图表 this.trackAnalytics(); // 同步发送统计 }, methods: { initChart() { // 同步操作 const chart = document.getElementById(&#39;chart&#39;); chart.render(); }, trackAnalytics() { // 同步操作 console.log(&#39;统计完成&#39;); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值