myblog

详细页

情景:滚动条与 top 按钮组件结合

任务:需要解决两个没有关系的组件相互通信,简单的方法是通过事件一直传输到跟组件,然后再返回到另一个需要通信的组件,然而效率不高,所以用事件总线来解决:

事件总线可以监听j组件/普通js模块与组件/普通js模块相互通信的过程

事件总线:

1.提供监听某个事件的接口

2.提供取消监听的接口

3.触发事件的接口(可以传递数据)

4.触发事件后会自动通知监听者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const listeners = {};

export default {

$on(eventName, handler) {

if (!listeners[eventName]) {

listeners[eventName] = new Set();

}

listeners[eventName].add(handler);

},

$off(eventName, handler) {

if (!listeners[eventName]) {

return;

}

listeners[eventName].delete(handler);

},

$emit(eventName, ...arges) {

// 事件触发

if (!listeners[eventName]) {

return;

}

for (const handler of listeners[eventName]) {

handler(...arges);

}

}

}

// 全局事件总线(更为常用的写法,因为vue中有事件on\off\emit)
// import Vue from 'vue';
// export default new Vue({});

然后在需要的地方引入使用

或者更为方便的用法:

1
2
3
import Vue from 'vue';

Vue.prototype.$bus = new Vue({});

main.js 中:

1
import "./eventBus";

所有文件都引入了

然后在Detail中监听,在toc组件中触发

最后,为了节约效率,需要防抖

情景:滚轮滚到目录标题后高亮侧栏目录标题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
data(){

return {

activeAnchor:"article-md-title-2"

}

},

computed: {

tocwithselect(){

const getToc = (toc = [])=>{

return toc.map((t)=>{

return {

...t,

isSelect:t.anchor===this.activeAnchor,

children:getToc(t.children)

}

})

}

return getToc(this.toc)

}

},

情景:评论滑到底部显示加载中效果

情景:回到顶部组件

最后,由于其代码使用率高,所有使用混合minix,

Vuex

1
npm i vuex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
store/index.js:

//数据仓库模块

import Vuex from 'vuex'

import Vue from 'vue'

Vue.use(Vuex)


const store = new Vuex.Store({

state:{

count:0

},

})

export default store;
1
2
3
4
5
6
7
8
9
main.js:

import store from "./store";

new Vue({
router,
store,
render: (h) => h(App),
}).$mount("#app");

文章列表页

图片懒加载(延迟加载,因为图片多,全部缓存需要时间久)

自定义指令实现

1
2
3
4
5
// 注册全局指令

import vLazy from "./directives/lazy";

Vue.directive("lazy", vlazy);

bug

image-20240627164317643

1
2
3
4
5
created() {

this.$ref.mainContainer.addEventListener("scroll", handleScroll);

},

不能放在 created 中,放在mounted中

image-20240628144919240

不能放在 created 中,放在mounted中
检查事件名称

项目启动:

1
2
3
4
5
6
7
npm cache clean --force 

npm install -g @vue/cli@4.5.0

npm i

npm run serve

myblog
http://example.com/2024/06/07/vue个人博客/
作者
John Doe
发布于
2024年6月7日
许可协议