精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue2剝絲抽繭-響應(yīng)式系統(tǒng)之分支切換

開發(fā) 前端
今天這個主要就是對響應(yīng)式系統(tǒng)的一點優(yōu)化,避免不必要的重新執(zhí)行。所做的事情就是重新調(diào)用函數(shù)的時候,把已經(jīng)沒有關(guān)聯(lián)的 Watcher 去除。

場景

我們考慮一下下邊的代碼會輸出什么。

import { observe } from "./reactive";
import Watcher from "./watcher";
const data = {
text: "hello, world",
ok: true,
};
observe(data);

const updateComponent = () => {
console.log("收到", data.ok ? data.text : "not");
};

new Watcher(updateComponent); // updateComponent 執(zhí)行一次函數(shù),輸出 hello, world

data.ok = false; // updateComponent 執(zhí)行一次函數(shù),輸出 not

data.text = "hello, liang"; // updateComponent 會執(zhí)行嗎?

我們來一步一步理清:

observer(data)

攔截了 data 中 text 和 ok 的 get、set,并且各自初始化了一個 Dep 實例,用來保存依賴它們的 Watcher 對象。

new Watcher(updateComponent);

這一步會執(zhí)行 updateComponent 函數(shù),執(zhí)行過程中用到的所有對象屬性,會將 Watcher 收集到相應(yīng)對象屬性中的Dep 中。

當然這里的 Watcher 其實是同一個,所以用了指向的箭頭。

data.ok = false;

這一步會觸發(fā) set ,從而執(zhí)行 Dep 中所有的 Watcher ,此時就會執(zhí)行一次 updateComponent 。

執(zhí)行 updateComponent 就會重新讀取 data 中的屬性,觸發(fā) get,然后繼續(xù)收集 Watcher 。

重新執(zhí)行 updateComponent 函數(shù) 的時候:

const updateComponent = () => {
console.log("收到", data.ok ? data.text : "not");
};

因為 data.ok 的值變?yōu)?false ,所以就不會觸發(fā) data.text 的 get ,text 的 Dep 就不會變化了。

而 data.ok 會繼續(xù)執(zhí)行,觸發(fā) get 收集 Watcher ,但由于我們 Dep 中使用的是數(shù)組,此時收集到的兩個 Wacher 其實是同一個,這里是有問題,會導致 updateComponent 重復執(zhí)行,一會兒我們來解決下。

data.text = "hello, liang";

執(zhí)行這句的時候,會觸發(fā) text 的 set,所以會執(zhí)行一次 updateComponent 。但從代碼來看 updateComponent 函數(shù)中由于 data.ok 為 false,data.text 對輸出沒有任何影響,這次執(zhí)行其實是沒有必要的。

之所以執(zhí)行了,是因為第一次執(zhí)行 updateComponent 讀取了 data.text 從而收集了 Watcher ,第二次執(zhí)行 updateComponent 的時候,data.text 雖然沒有讀到,但之前的 Watcher 也沒有清除掉,所以這一次改變 data.text 的時候 updateComponent 依舊會執(zhí)行。

所以我們需要的就是當重新執(zhí)行 updateComponent 的時候,如果 Watcher 已經(jīng)不依賴于某個 Dep 了,我們需要將當前 Watcher 從該 Dep 中移除掉。

問題

總結(jié)下來我們需要做兩件事情。

  • 去重,Dep 中不要重復收集 Watcher 。
  • 重置,如果該屬性對 Dep 中的 Wacher 已經(jīng)沒有影響了(換句話就是,Watcher 中的 updateComponent 已經(jīng)不會讀取到該屬性了 ),就將該 Watcher 從該屬性的 Dep 中刪除。

去重

去重的話有兩種方案:

  • Dep 中的 subs 數(shù)組換為 Set。
  • 每個 Dep 對象引入 id ,Watcher 對象中記錄所有的 Dep 的 id,下次重新收集依賴的時候,如果 Dep 的 id 已經(jīng)存在,就不再收集該 Watcher 了。

Vue2 源碼中采用的是方案 2 這里我們實現(xiàn)下:

Dep 類的話只需要引入 id 即可。

/*************改動***************************/
let uid = 0;
/****************************************/
export default class Dep {
static target; //當前在執(zhí)行的函數(shù)
subs; // 依賴的函數(shù)
id; // Dep 對象標識
constructor() {
/**************改動**************************/
this.id = uid++;
/****************************************/
this.subs = []; // 保存所有需要執(zhí)行的函數(shù)
}

addSub(sub) {
this.subs.push(sub);
}
depend() {
if (Dep.target) {
// 委托給 Dep.target 去調(diào)用 addSub
Dep.target.addDep(this);
}
}

notify() {
for (let i = 0, l = this.subs.length; i < l; i++) {
this.subs[i].update();
}
}
}

Dep.target = null; // 靜態(tài)變量,全局唯一

在 Watcher 中,我們引入 this.depIds 來記錄所有的 id 。

import Dep from "./dep";
export default class Watcher {
constructor(Fn) {
this.getter = Fn;
/*************改動***************************/
this.depIds = new Set(); // 擁有 has 函數(shù)可以判斷是否存在某個 id
/****************************************/
this.get();
}

/**
* Evaluate the getter, and re-collect dependencies.
*/
get() {
Dep.target = this; // 保存包裝了當前正在執(zhí)行的函數(shù)的 Watcher
let value;
try {
value = this.getter.call();
} catch (e) {
throw e;
} finally {
this.cleanupDeps();
}
return value;
}

/**
* Add a dependency to this directive.
*/
addDep(dep) {
/*************改動***************************/
const id = dep.id;
if (!this.depIds.has(id)) {
dep.addSub(this);
}
/****************************************/

}

/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
update() {
this.run();
}

/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
run() {
this.get();
}
}

重置

同樣是兩個方案:

  • 全量式移除,保存 Watcher 所影響的所有 Dep 對象,當重新收集 Watcher 的前,把當前 Watcher 從記錄中的所有 Dep 對象中移除。
  • 增量式移除,重新收集依賴時,用一個新的變量記錄所有的 Dep 對象,之后再和舊的 Dep 對象列表比對,如果新的中沒有,舊的中有,就將當前 Watcher 從該 Dep 對象中移除。

Vue2 中采用的是方案 2,這里也實現(xiàn)下。

首先是 Dep 類,我們需要提供一個 removeSub 方法。

import { remove } from "./util";
/*
export function remove(arr, item) {
if (arr.length) {
const index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1);
}
}
}
*/
let uid = 0;

export default class Dep {
static target; //當前在執(zhí)行的函數(shù)
subs; // 依賴的函數(shù)
id; // Dep 對象標識
constructor() {
this.id = uid++;
this.subs = []; // 保存所有需要執(zhí)行的函數(shù)
}

addSub(sub) {
this.subs.push(sub);
}
/*************新增************************/
removeSub(sub) {
remove(this.subs, sub);
}
/****************************************/
depend() {
if (Dep.target) {
// 委托給 Dep.target 去調(diào)用 addSub
Dep.target.addDep(this);
}
}

notify() {
for (let i = 0, l = this.subs.length; i < l; i++) {
this.subs[i].update();
}
}
}

Dep.target = null; // 靜態(tài)變量,全局唯一

然后是 Watcher 類,我們引入 this.deps 來保存所有的舊 Dep 對象,引入 this.newDeps 來保存所有的新 Dep 對象。

import Dep from "./dep";
export default class Watcher {
constructor(Fn) {
this.getter = Fn;
this.depIds = new Set(); // 擁有 has 函數(shù)可以判斷是否存在某個 id
/*************新增************************/
this.deps = [];
this.newDeps = []; // 記錄新一次的依賴
this.newDepIds = new Set();
/****************************************/
this.get();
}

/**
* Evaluate the getter, and re-collect dependencies.
*/
get() {
Dep.target = this; // 保存包裝了當前正在執(zhí)行的函數(shù)的 Watcher
let value;
try {
value = this.getter.call();
} catch (e) {
throw e;
} finally {
/*************新增************************/
this.cleanupDeps();
/****************************************/
}
return value;
}

/**
* Add a dependency to this directive.
*/
addDep(dep) {
const id = dep.id;
/*************新增************************/
// 新的依賴已經(jīng)存在的話,同樣不需要繼續(xù)保存
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
/****************************************/
}

/**
* Clean up for dependency collection.
*/
/*************新增************************/
cleanupDeps() {
let i = this.deps.length;
// 比對新舊列表,找到舊列表里有,但新列表里沒有,來移除相應(yīng) Watcher
while (i--) {
const dep = this.deps[i];
if (!this.newDepIds.has(dep.id)) {
dep.removeSub(this);
}
}

// 新的列表賦值給舊的,新的列表清空
let tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
}
/****************************************/
/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
update() {
this.run();
}

/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
run() {
this.get();
}
}

測試

回到開頭的代碼:

import { observe } from "./reactive";
import Watcher from "./watcher";
const data = {
text: "hello, world",
ok: true,
};
observe(data);

const updateComponent = () => {
console.log("收到", data.ok ? data.text : "not");
};

new Watcher(updateComponent); // updateComponent 執(zhí)行一次函數(shù),輸出 hello, world

data.ok = false; // updateComponent 執(zhí)行一次函數(shù),輸出 not

data.text = "hello, liang"; // updateComponent 會執(zhí)行嗎?

此時 data.text 修改的話就不會再執(zhí)行 updateComponent 了,因為第二次執(zhí)行的時候,我們把 data.text 中 Dep 里的 Watcher 清除了。

總結(jié)

今天這個主要就是對響應(yīng)式系統(tǒng)的一點優(yōu)化,避免不必要的重新執(zhí)行。所做的事情就是重新調(diào)用函數(shù)的時候,把已經(jīng)沒有關(guān)聯(lián)的 Watcher 去除。

不知道看到這里大家有沒有一個疑問,我是一直沒想到說服我的點,歡迎一起交流:

在解決去重問題上,我們是引入了 id ,但如果直接用 set 其實就可以。在 Watcher 類中是用 Set 來存 id ,用數(shù)組來存 Dep 對象,為什么不直接用 Set 來存 Dep 對象呢?

責任編輯:武曉燕 來源: windliang
相關(guān)推薦

2022-03-29 09:59:58

響應(yīng)式系統(tǒng)Vue2

2022-04-03 19:27:35

Vue2響應(yīng)式系統(tǒng)

2022-04-06 07:28:47

數(shù)組響應(yīng)式系統(tǒng)

2022-04-02 09:56:41

Vue2響應(yīng)式系統(tǒng)

2022-04-14 08:46:46

響應(yīng)式系統(tǒng)js

2022-04-12 10:05:18

響應(yīng)式系統(tǒng)異步隊列

2022-04-10 11:04:40

響應(yīng)式系統(tǒng)setdelete

2022-08-31 08:09:35

Vue2AST模版

2024-09-02 16:10:19

vue2前端

2023-03-02 11:51:00

數(shù)據(jù)分析師企業(yè)

2024-03-07 12:54:06

數(shù)據(jù)分析師企業(yè)

2019-04-25 14:20:56

數(shù)據(jù)分析套路工具

2021-05-19 14:25:19

前端開發(fā)技術(shù)

2022-06-26 00:00:02

Vue3響應(yīng)式系統(tǒng)

2024-03-15 11:47:19

Vue2前端權(quán)限控制

2023-02-13 00:20:08

分布式系統(tǒng)安全

2023-11-19 18:53:27

Vue2MVVM

2016-10-19 20:47:55

vuevue-cli移動端

2020-09-25 07:40:39

技術(shù)開發(fā)選型

2019-12-06 10:44:53

Vue 3.0響應(yīng)式系統(tǒng)前端
點贊
收藏

51CTO技術(shù)棧公眾號

久久久综合久久久| 国内国产精品天干天干| 激情小视频在线观看| 三级一区在线视频先锋| 日韩中文字幕在线视频| 久久久久久综合网| av免费不卡国产观看| 国产嫩草影院久久久久| 亚洲综合av影视| 久久国产视频播放| 午夜精品毛片| 亚洲精品福利视频| 中文字幕中文在线| 亚洲性受xxx喷奶水| 综合中文字幕亚洲| 国产女主播一区二区三区| 无码任你躁久久久久久久| 亚洲二区三区不卡| 亚洲午夜女主播在线直播| 成人三级做爰av| 国产私拍福利精品视频二区| 亚洲一区二区三区三| 色姑娘综合网| 黄色a在线观看| 蜜桃视频在线观看一区二区| 91高清视频免费| 亚洲xxxx3d动漫| 伊人久久大香线蕉综合网站| 日韩女优电影在线观看| 亚洲一区二区三区四区五区| 中国色在线日|韩| 一区二区三区欧美在线观看| 亚洲欧美精品在线观看| 欧洲伦理片一区 二区 三区| 成人免费视频一区| 亚洲xxxx3d| 伊人网免费视频| 老司机午夜精品视频| 午夜精品视频网站| 久久久精品少妇| 日韩久久视频| 一本久久综合亚洲鲁鲁| 国产男男chinese网站| 给我免费播放日韩视频| 日韩欧美一二三四区| 中文字幕第一页在线视频| 97成人超碰| 欧洲色大大久久| 无码内射中文字幕岛国片| 台湾佬中文娱乐网欧美电影| 午夜视频一区二区| 精品人妻少妇一区二区| 麻豆蜜桃在线| 亚洲国产精品久久艾草纯爱| 欧美图片激情小说| 波多野结依一区| 亚洲va欧美va人人爽午夜| 国产免费xxx| 50度灰在线| 亚洲综合无码一区二区| 国产成人在线小视频| 牛牛电影国产一区二区| 亚洲国产精品久久艾草纯爱| 亚洲熟妇无码另类久久久| 97人人爽人人澡人人精品| 天涯成人国产亚洲精品一区av| 青青草精品视频在线| 涩涩涩在线视频| 一本大道久久a久久综合| 久久综合久久色| 日本免费一区二区三区等视频| 欧美三日本三级三级在线播放| 久久99爱视频| 麻豆精品在线| 亚洲电影av在线| 精品人妻无码一区二区三区| 精品久久久久久久久久久aⅴ| 中文字幕亚洲自拍| 久久精品视频免费在线观看| 亚洲一级电影| 国产精品久久久久av| 国产又粗又黄又爽的视频| 国产精品亚洲а∨天堂免在线| 国产精品yjizz| 欧洲毛片在线| 亚洲欧美日本在线| 欧美啪啪免费视频| 人人玩人人添人人澡欧美| 日韩小视频在线观看专区| 精品1卡二卡三卡四卡老狼| 蜜臀av免费一区二区三区| 中文字幕精品一区二区精品| 欧美爱爱小视频| 亚洲尤物影院| 91精品在线观看视频| 天天摸天天干天天操| 欧美韩国日本综合| 丁香六月激情婷婷| 黄色成人小视频| 日韩成人在线播放| 91n在线视频| 亚洲一区二区免费看| 成人欧美一区二区三区在线湿哒哒| 亚洲精品国产手机| 国产欧美视频一区二区三区| 日韩在线视频在线| 成人国产一区| 日韩成人中文电影| 久草综合在线视频| 夜夜嗨一区二区| 91精品一区二区| 国产玉足榨精视频在线观看| 亚洲一区二区影院| 日本中文字幕影院| 亚洲另类春色校园小说| 欧美精品激情在线| 国产精品色综合| 国产无遮挡一区二区三区毛片日本| 91大学生片黄在线观看| 99九九久久| 日韩精品免费在线视频观看| 26uuu成人网| 美女脱光内衣内裤视频久久影院| 国产九色91| av毛片在线| 欧美老人xxxx18| 蜜臀久久99精品久久久久久| 亚洲每日在线| 97人人澡人人爽| 欧美日韩在线资源| 欧美性一二三区| 成人性生交大免费看| 日韩视频久久| 国产精品xxx在线观看www| 在线观看午夜av| 5566中文字幕一区二区电影| 日本在线观看网址| 日韩av一级电影| 青娱乐一区二区| 欧美大胆性生话| 亚洲欧美中文日韩v在线观看| 日韩欧美不卡视频| 成人h动漫精品一区二区| 超碰人人爱人人| 国产精一区二区| 久久夜色精品国产欧美乱| 国产又粗又大又黄| 中文字幕一区二区三区不卡| 色婷婷成人在线| 93在线视频精品免费观看| 国产精品综合久久久| 91社区在线高清| 欧美日韩综合色| 日韩在线不卡av| 国产麻豆日韩欧美久久| 麻豆映画在线观看| 91在线一区| 97精品一区二区三区| 污污网站免费在线观看| 疯狂做受xxxx欧美肥白少妇 | 搜索黄色一级片| 精品一区二区三区不卡| 日韩最新中文字幕| 亚洲一区二区三区在线免费 | 免费成人美女女| 中文字幕免费精品一区| 夜夜嗨av禁果av粉嫩avhd| 亚洲视频一二三| 日本人添下边视频免费| 日韩一级不卡| 亚洲国产欧美日韩| 秋霞午夜一区二区三区视频| 久久免费视频网站| 精品福利视频导航大全| 欧美精品 国产精品| 国产成人无码aa精品一区| 成人激情小说网站| 99免费视频观看| 先锋资源久久| 国产一区二区免费电影| 中文不卡1区2区3区| 中文字幕亚洲一区在线观看 | 香蕉成人app| 欧洲亚洲妇女av| 欧美人xxx| 亚洲精品美女久久久| 亚洲精品一区二区二区| 一区二区三区四区亚洲| 尤物视频最新网址| 国产精品羞羞答答xxdd| 成人一区二区三| 欧美精品1区| 日本亚洲欧洲精品| av动漫精品一区二区| 国产精品普通话| heyzo中文字幕在线| 三级精品视频久久久久| 丰满人妻一区二区三区四区53| 91黄色免费看| 亚洲一区二区91| 国产精品第一页第二页第三页| 日本美女视频网站| 久久国产婷婷国产香蕉| 日本日本19xxxⅹhd乱影响| 欧美国产美女| 欧美日韩亚洲在线| 一区二区亚洲视频| 国产精品香蕉国产| 性国裸体高清亚洲| 欧美激情视频一区二区| 自拍视频在线| 国产午夜精品免费一区二区三区 | 欧美成人激情在线| 国产在线日本| 日韩电影中文字幕一区| 精品人妻无码一区二区色欲产成人| 日本黄色一区二区| 日本少妇在线观看| 一区二区三区在线免费观看| 国产视频不卡在线| 久久久久88色偷偷免费| 少妇精品无码一区二区三区| 国产在线一区二区| 美女在线视频一区二区| 日韩高清不卡一区| 美女福利视频在线| 免费视频久久| www黄色av| 性色av一区二区怡红| 欧美视频免费看欧美视频| 欧美片第1页综合| 成人在线免费观看网址| 影音先锋日韩在线| 中文字幕中文字幕一区三区| 日韩黄色大片网站| 日韩三级电影网站| 精品av一区二区| 欧洲在线视频一区| 欧美日韩黑人| 视频一区三区| 日本成人小视频| 五月天久久狠狠| 色婷婷色综合| 国产又粗又爽又黄的视频| 欧美高清在线| 一级黄色片播放| 欧美精品网站| 男人添女荫道口女人有什么感觉| 欧美日韩亚洲三区| 国产夫妻自拍一区| 99精品福利视频| 大陆极品少妇内射aaaaa| 国产精品嫩草99av在线| 成熟老妇女视频| 日本va欧美va精品发布| 一本色道久久亚洲综合精品蜜桃| 蜜臀av一区二区| 青娱乐精品在线| 国产91精品在线观看| 黄色免费视频网站| 久久免费电影网| 国产一二三四视频| 亚洲欧美色综合| 国产精品99精品无码视| 欧美日韩性生活视频| 国产精品欧美综合| 911精品国产一区二区在线| 精品人妻午夜一区二区三区四区 | 亚洲国产精品日韩| 一个色综合网| 缅甸午夜性猛交xxxx| 视频一区在线播放| 国产又黄又猛的视频| 从欧美一区二区三区| 亚洲久久久久久久| 亚洲同性gay激情无套| 亚洲一区二区91| 欧美日韩一卡二卡三卡| 国产丰满美女做爰| 日韩麻豆第一页| 成视频免费观看在线看| 午夜精品久久久久久久99热浪潮 | 在线亚洲伦理| 中文字幕天天干| 国产99久久精品| 一级肉体全黄裸片| 亚洲黄网站在线观看| 欧美一区二区三区不卡视频| 7777精品伊人久久久大香线蕉完整版 | 天天综合视频在线观看| 久久久久国产精品一区| 亚洲精品粉嫩美女一区| 成人av网站观看| 青青草91久久久久久久久| 韩日视频在线观看| 裸体一区二区三区| 亚洲色图14p| 亚洲人成网站影音先锋播放| 亚洲另类在线观看| 日韩欧美在线影院| av电影在线观看一区二区三区| 隔壁老王国产在线精品| 亚洲精品第一| 欧美一级日本a级v片| 国产专区一区| 国产一区二区在线观看免费视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 波多野结衣视频在线看| 欧美videofree性高清杂交| 成人高清在线| 欧美在线免费视频| 99re8这里有精品热视频8在线| 久久久一本精品99久久精品| 午夜国产一区二区| 国产高清视频网站| 久久天天做天天爱综合色| 免费在线观看av网址| 欧美另类久久久品| porn视频在线观看| 青草热久免费精品视频| youjizz亚洲| 亚洲精品国产suv一区88| 麻豆国产欧美日韩综合精品二区| 中文精品在线观看| 亚洲超碰97人人做人人爱| 亚洲国产精品二区| 久久福利网址导航| 国产精品久久久久久久久久辛辛 | www.26天天久久天堂| 精品一区二区久久久久久久网站| 欧美午夜在线视频| 97超碰免费在线观看| 亚洲人午夜精品天堂一二香蕉| 中文字幕久久久久| 一区二区欧美亚洲| 成人日韩精品| 日韩欧美亚洲v片| 日韩av在线免费观看不卡| 美女被到爽高潮视频| 色就色 综合激情| 九色视频成人自拍| 国产不卡在线观看| 国产欧美日韩免费观看| 欧美激情国产精品日韩| 26uuu亚洲综合色| 成人毛片18女人毛片| 亚洲欧美日韩国产中文| 欧美一区 二区 三区| 日韩国产一区久久| 蜜乳av一区二区三区| 午夜激情福利电影| 欧美一区二区三区影视| 污视频在线看网站| 国产精品久久精品视| 一区二区三区福利| 精品无码在线观看| 欧美日韩国产三级| 精品自拍一区| 97超级在线观看免费高清完整版电视剧| 欧美日本在线| 国产精品无码网站| 欧美在线观看禁18| 精品176二区| 国产一区二区在线观看免费播放| 99在线|亚洲一区二区| 中文幕无线码中文字蜜桃| 欧美三级视频在线| 国产在线更新| 国产伦一区二区三区色一情| 亚欧美中日韩视频| 91动漫免费网站| 欧美成人精品1314www| 亚洲一区站长工具| 免费看啪啪网站| 成人av在线资源网| 波多野结衣电车痴汉| 免费av一区二区| 亚洲区小说区| 国产精品久久久久久久av福利| 亚洲国产色一区| 国产一级网站视频在线| 亚洲va久久久噜噜噜| 亚洲一区亚洲| 国产精品丝袜一区二区| 亚洲精品第一页| 日韩美香港a一级毛片| 久久亚洲精品无码va白人极品| 久久精品一区二区三区不卡牛牛| 国产精品无码AV| 茄子视频成人在线| 欧美日韩一区二区三区四区在线观看| 亚洲天堂久久新| 日韩女优av电影在线观看| 中文字幕av一区二区三区佐山爱| 好吊色这里只有精品| 久久中文娱乐网| 性网爆门事件集合av| 国产精品普通话| 六月婷婷一区| 国产一级久久久|