欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue中的 mixins 和 provide/inject詳解

 更新時(shí)間:2023年07月05日 14:30:55   作者:努力的小朱同學(xué)  
這篇文章主要介紹了Vue中的 mixins 和 provide/inject詳解,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、mixins

1、簡(jiǎn)介

? mixins 又稱(chēng) 混入,是指將一些可復(fù)用的代碼(JS、生命周期鉤子函數(shù)等等)抽離出來(lái),定義成mixins模塊,然后混入到多個(gè)組件中,從而實(shí)現(xiàn)組件間的邏輯代碼共享,減少重復(fù)代碼。當(dāng)組件使用mixins模塊時(shí),mixins模塊內(nèi)部的代碼將會(huì)被“混合”進(jìn)組件的代碼,代碼“混合”邏輯與Vue.extend()相同,具體邏輯下面有講解。

2、基礎(chǔ)使用

? mixins模塊在組件內(nèi)是通過(guò)與data、mountedmethods等鉤子函數(shù)同級(jí)的mixins鉤子調(diào)用的,該鉤子的值是一個(gè)數(shù)組,里面包含要混入當(dāng)前組件的mixins模塊,這些模塊的混入順序按照mixins鉤子數(shù)組的排列順序執(zhí)行,而且mixins模塊內(nèi)如果包含生命周期鉤子函數(shù),則模塊內(nèi)的鉤子函數(shù)執(zhí)行順序先于組件本身的鉤子函數(shù)。

案例代碼:

// 定義一個(gè)mixin模塊 mixin.js
export default {
  created: function () { console.log('這里是mixin1模塊的created') }
}
// 在組件實(shí)例中引入并使用定義的mixin模塊
// 引入mixin模塊
import mixin from "../mixins/mixin";
export default {
  created: function () { console.log('這里是組件本身的created') },
  // 使用mixin模塊
  mixins: [mixin]
}

執(zhí)行結(jié)果:

在這里插入圖片描述

3、選項(xiàng)合并

? 當(dāng)組件與引入的mixins模塊含有同名選項(xiàng)時(shí),這些鉤子將依照下面的規(guī)則進(jìn)行合并( Vue.extend()的合并邏輯相同):

? ① mixins模塊中的data數(shù)據(jù)對(duì)象,將與組件的data數(shù)據(jù)進(jìn)行遞歸合并,如果存在同名數(shù)據(jù),則取組件內(nèi)的數(shù)據(jù)值。

? 當(dāng)組件引入多個(gè)mixins模塊時(shí),將按照mixins鉤子數(shù)組的排列順序進(jìn)行合并,如果mixins模塊之間存在同名數(shù)據(jù),則取排序最后的那個(gè)mixins模塊的數(shù)據(jù)值,當(dāng)然,如果該數(shù)據(jù)在組件內(nèi)也存在,則還是取組件內(nèi)的數(shù)據(jù)值。

案例代碼:

// 定義一個(gè)mixin1.js模塊
export default {
  data() {
    return {
      a: 1, // 第一個(gè)混入模塊中的變量a
      b: 11 // 第一個(gè)混入模塊中的變量b
    }
  },
}
// 定義一個(gè)mixin2.js模塊
export default {
  data() {
    return {
      a: 2, // 第二個(gè)混入模塊中的變量a
      b: 22 // 第二個(gè)混入模塊中的變量b
    }
  },
}
// 在組件實(shí)例中引入并使用定義的mixin模塊
// 引入兩個(gè)mixin模塊
import mixin1 from "../mixins/mixin1";
import mixin2 from "../mixins/mixin2";
export default {
  data() {
    return {
      b: 0, // 組件內(nèi)的變量b
    };
  },
  mounted() {
    // 組件內(nèi)不存在這個(gè)變量 兩個(gè)混入模塊存在同名變量 最終值取決于模塊引用順序
    console.log("經(jīng)過(guò)合并后變量a的值是-----", this.a);
    // 組件內(nèi)存在這個(gè)變量 最終值取組件內(nèi)的值
    console.log("經(jīng)過(guò)合并后變量b的值是-----", this.b);
  },
  // 使用兩個(gè)mixin模塊 注意先后順序 決定同名變量的最終取值
  mixins: [mixin1, mixin2],
}

執(zhí)行結(jié)果:

在這里插入圖片描述

? ② mixins模塊中的鉤子函數(shù),將與組件內(nèi)的同名鉤子函數(shù)合并成一個(gè)數(shù)組,依次執(zhí)行,且mixins模塊中的鉤子函數(shù)在組件同名鉤子函數(shù)之前調(diào)用執(zhí)行。不同名的鉤子函數(shù),依舊按照鉤子函數(shù)的先后順序執(zhí)行。

? 當(dāng)組件引入多個(gè)mixins模塊時(shí),如果mixins模塊之間存在同名鉤子函數(shù),則會(huì)按照mixins鉤子數(shù)組的排列順序合并成一個(gè)數(shù)組,排列順序與執(zhí)行順序相同,排序靠前的mixins模塊中的同名鉤子函數(shù)先執(zhí)行,排序靠后的后執(zhí)行,最終才會(huì)執(zhí)行組件本身的同名鉤子函數(shù)。

案例代碼:

// 定義一個(gè)mixin1.js模塊
export default {
  created: function () { console.log('這里是mixin1模塊的created') },
}
// 定義一個(gè)mixin2.js模塊
export default {
  created: function () { console.log('這里是mixin2模塊的created') },
  mounted: function () { console.log('這里是mixin2模塊的mounted') },
}
// 在組件實(shí)例中引入并使用定義的mixin模塊
// 引入兩個(gè)mixin模塊
import mixin1 from "../mixins/mixin1";
import mixin2 from "../mixins/mixin2";
export default {
  created() {
    console.log("這里是組件本身的created");
  },
  // 使用兩個(gè)mixin模塊 注意先后順序 決定同名鉤子函數(shù)的執(zhí)行順序
  mixins: [mixin1, mixin2],
}

執(zhí)行結(jié)果:

在這里插入圖片描述

? ③ mixins模塊中的methods、components等值為對(duì)象的選項(xiàng),將會(huì)與組件內(nèi)部的對(duì)應(yīng)選項(xiàng)合并為一個(gè)對(duì)象,當(dāng)對(duì)象中的鍵名發(fā)生沖突時(shí),則取組件內(nèi)的鍵名對(duì)應(yīng)的值。

? 當(dāng)組件引入多個(gè)mixins模塊時(shí),如果mixins模塊之間的選項(xiàng)存在同名沖突時(shí),則會(huì)按照mixins鉤子數(shù)組的排列順序進(jìn)行覆蓋,后面的mixins會(huì)覆蓋前面的mixins,鍵名對(duì)應(yīng)的值將取排在最后的mixins模塊中對(duì)應(yīng)的值,當(dāng)然,如果該鍵名在組件內(nèi)也存在,則最終還是取組件內(nèi)的對(duì)應(yīng)的值。

案例代碼:

// 定義一個(gè)mixin1.js模塊
export default {
    methods: {
    test() {
      console.log('這里是mixin1模塊methods中的test函數(shù)')
    },
    test1() {
      console.log('這里是mixin1模塊methods中的test1函數(shù)')
    }
  },
}
// 定義一個(gè)mixin2.js模塊
export default {
  methods: {
    // 如果mixin模塊之間存在鍵名沖突 則以組件中mixin數(shù)組的引用順序?yàn)闇?zhǔn)
    // 取排序最后的鍵名對(duì)應(yīng)的值
    test1() {
      console.log('這里是mixin2模塊methods中的test1函數(shù)')
    }
  },
}
// 在組件實(shí)例中引入并使用定義的mixin模塊
// 引入兩個(gè)mixin模塊
import mixin1 from "../mixins/mixin1";
import mixin2 from "../mixins/mixin2";
export default {
  mounted() {
    this.test();
    this.test1();
  },
  // 使用兩個(gè)mixin模塊 注意先后順序 決定鍵名沖突的最終結(jié)果
  mixins: [mixin1, mixin2],
  methods: {
    // 如果mixin模塊與組件本身鍵名沖突 則以組件為最終結(jié)果
    test() {
      console.log("這里是組件本身methods中的test函數(shù)");
    },
  },
}

執(zhí)行結(jié)果:

在這里插入圖片描述

總結(jié):

? 當(dāng)一個(gè)組件使用了多個(gè)mixins時(shí),它們的順序很重要。因?yàn)楫?dāng)mixins之間的選項(xiàng)存在沖突時(shí),后面的mixins會(huì)覆蓋前面的mixins。而且同名鉤子函數(shù)的執(zhí)行順序也取決于多個(gè)mixins的順序。

? 當(dāng)組件與mixins的選項(xiàng)存在沖突時(shí),一切以組件為準(zhǔn)。

? 在使用多個(gè)mixins時(shí),記得注意命名沖突問(wèn)題。

4、全局混入

? 上面我們舉的例子都是在組件中依次引入mixins模塊,如果我們想要在多個(gè)組件中,甚至是所有組件中都引入某個(gè)mixins模塊,如果在每個(gè)組件中都引入一次,就太過(guò)繁瑣。此時(shí)我們可以使用全局混入特性。

? 全局混入是指將聲明的mixins模塊,在main.js文件中的全局Vue實(shí)例創(chuàng)建之前,通過(guò)Vue.mixin()方法,掛載到Vue上。其作用相當(dāng)于全局引入了mixins模塊,會(huì)影響到每一個(gè)單獨(dú)創(chuàng)建的Vue頁(yè)面實(shí)例和組件,因此請(qǐng)慎用該特性?。?!

? 如果全局混入的mixins模塊中包含生命周期鉤子函數(shù),那么該鉤子函數(shù)將會(huì)根據(jù)當(dāng)前頁(yè)面做包含的Vue實(shí)例數(shù)量來(lái)決定執(zhí)行的次數(shù),main.js文件的中的 全局Vue實(shí)例也算。

案例代碼:

// 定義一個(gè)allmixin.js 模塊
export default {
  created: function () { console.log('這里是全局mixin模塊的created') },
  methods: {
    test() {
      console.log('這里是全局mixin模塊methods中的test函數(shù)')
    }
  },
}
// 在main.js中引入并進(jìn)行全局混入
import Vue from 'vue'
import App from './App.vue'
import allMixin from './mixins/allMixin'
// 一定要在 new Vue 之前  否則不起作用
Vue.mixin(allMixin)
// 創(chuàng)建全局Vue實(shí)例
new Vue({
  render: h => h(App),
}).$mount('#app')
// 此時(shí)的頁(yè)面結(jié)構(gòu)
// mian.js的new Vue -> APP.vue -> test.vue

執(zhí)行結(jié)果:

在這里插入圖片描述

5、自定義選項(xiàng)

? 我們?cè)摽梢越Y(jié)合this.$options自定義選項(xiàng)來(lái)使用全局混入,只有使用自定義選項(xiàng)的組件才會(huì)觸發(fā)相關(guān)邏輯,從而局限mixins模塊中部分代碼的作用范圍:

案例代碼:

// 定義一個(gè)allmixin.js 模塊
export default {
  created: function () {
    // 自定義選項(xiàng) 并接收傳遞的值
    const myOptionValue = this.$options.myOption
    // 輸出傳遞的值
    if (myOptionValue) {
      console.log('-*------', myOptionValue)
    }
  },
}
// 在main.js中引入并進(jìn)行全局混入
import Vue from 'vue'
import App from './App.vue'
import allMixin from './mixins/allMixin'
// 一定要在 new Vue 之前  否則不起作用
Vue.mixin(allMixin)
// 創(chuàng)建全局Vue實(shí)例
new Vue({
  render: h => h(App),
}).$mount('#app')
// 在組件使用全局混入中自定義的選項(xiàng)
export default {
    data() {
        return {}
    },
    // 使用自定義選項(xiàng)
    myOption: "這是我向自定義選項(xiàng)傳遞的字符串",
}

執(zhí)行結(jié)果:

在這里插入圖片描述

? mixins模塊中的自定義選項(xiàng)在合并時(shí),使用的是默認(rèn)策略,即簡(jiǎn)單的覆蓋已有的值。當(dāng)然我們也可以通過(guò)Vue.config.optionMergeStrategies來(lái)自定義合并邏輯:

// 自定義合并邏輯
Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {
  // 返回合并后的值
}
// 或者
// 采用現(xiàn)有邏輯 與methods相同
Vue.config.optionMergeStrategies.myOption = Vue.config.optionMergeStrategies.methods

二、provide/inject

1、簡(jiǎn)介

? provide/inject 是Vue在2.2.0版本新增的特性,該特性可以實(shí)現(xiàn)祖先組件向其后代組件跨層級(jí)傳遞數(shù)據(jù),無(wú)論兩者中間相隔多少組件層級(jí),相對(duì)于傳統(tǒng)的props傳遞方式,減少了傳遞數(shù)據(jù)的繁瑣操作,提升了代碼的可讀性和可維護(hù)性。該特性與React 框架的上下文特性很相似。

? 但是過(guò)多的使用provide/inject 特性,會(huì)增加組件之間的耦合性,降低組件的可復(fù)用性,因此使用該特性時(shí)要謹(jǐn)慎,不可濫用。而且provideinject的綁定并不是響應(yīng)式的,傳遞的數(shù)據(jù)并不會(huì)自動(dòng)響應(yīng)數(shù)據(jù)變化,如果想要響應(yīng)數(shù)據(jù)變化,請(qǐng)借助datacomputed

2、provide

? provide選項(xiàng)需要在祖先組件中使用,作用是向后代組件傳遞數(shù)據(jù),其選項(xiàng)值為一個(gè)對(duì)象或一個(gè)返回值為對(duì)象的函數(shù),對(duì)象的屬性即為要向其后代組件傳遞的數(shù)據(jù)。傳遞的數(shù)據(jù)可以是任意類(lèi)型的數(shù)據(jù),如基本類(lèi)型、對(duì)象、函數(shù)等等。

? provide選項(xiàng)中支持使用 ES2015 Symbols 作為 key,但是只在原生支持 SymbolReflect.ownKeys 的環(huán)境下可工作

案例代碼:

// provide 的選項(xiàng)值為一個(gè)對(duì)象
export default {
    data() {
        return {}
    },
    provide: {
        a: "這是祖先組件向后代組件傳遞的字符串?dāng)?shù)據(jù)",
    	b: {
      		c: "這是祖先組件向后代組件傳遞的對(duì)象數(shù)據(jù)",
    	},
    	f: function () {
      		console.log("這是祖先組件向后代組件傳遞的函數(shù)數(shù)據(jù)");
    	},
    },
}
// provide 的選項(xiàng)值為一個(gè)返回值為對(duì)象的函數(shù)
export default {
    data() {
        return {}
    },
    provide() {
    	return {
      		 a: "這是祖先組件向后代組件傳遞的字符串?dāng)?shù)據(jù)",
        	 b: {
          	 	c: "這是祖先組件向后代組件傳遞的對(duì)象數(shù)據(jù)",
        	 },
        	 f: function () {
          	 	console.log("這是祖先組件向后代組件傳遞的函數(shù)數(shù)據(jù)");
        	 },
    	  };
  	  },
}

3、inject

? inject選項(xiàng)是在后代組件中使用,作用是接收祖先組件傳遞的數(shù)據(jù),其選項(xiàng)值為一個(gè)字符串?dāng)?shù)組(推薦)或一個(gè)對(duì)象。更推薦使用字符串?dāng)?shù)組的形式,其中數(shù)組元素對(duì)應(yīng)的是provide對(duì)象中的key,通過(guò)this.數(shù)組字符串元素的形式來(lái)訪問(wèn)祖先組件傳遞的對(duì)應(yīng)數(shù)據(jù);如果使用對(duì)象形式,則需要通過(guò)鍵值對(duì)來(lái)接收數(shù)據(jù),鍵名表示當(dāng)前組件內(nèi)的訪問(wèn)名稱(chēng),value為字符串,對(duì)應(yīng)的是provide對(duì)象中的key,通過(guò)this.鍵名的形式來(lái)訪問(wèn)祖先組件傳遞的對(duì)應(yīng)數(shù)據(jù)。

案例代碼:

// inject 的選項(xiàng)值為一個(gè)字符串?dāng)?shù)組(推薦)
export default {
    data() {
        return {}
    },
	inject: ["a", "b", "f"],
}
// inject 的選項(xiàng)值為一個(gè)對(duì)象(不推薦)
export default {
    data() {
        return {}
    },
	inject: {
    	a: "a",
    	b: "b",
    	f: "f",
  	},
}
// 在后代組件中通過(guò)inject接收傳遞的數(shù)據(jù)之后 調(diào)用傳遞的數(shù)據(jù)
mounted() {
    console.log("inject接收的祖先組件傳遞過(guò)來(lái)的字符串?dāng)?shù)據(jù)-----", this.a);
    console.log("inject接收的祖先組件傳遞過(guò)來(lái)的對(duì)象數(shù)據(jù)-----", this.b);
    console.log("inject接收的祖先組件傳遞過(guò)來(lái)的函數(shù)數(shù)據(jù)-----", this.f);
},

執(zhí)行結(jié)果:

在這里插入圖片描述

4、進(jìn)階知識(shí)

① 在Vue的2.2.1版本之后,后代組件中通過(guò)inject接收傳遞的數(shù)據(jù),會(huì)在propsdata初始化之前得到,因此我們可以使用inject中的數(shù)據(jù)給propsdata中的數(shù)據(jù)設(shè)置默認(rèn)值。

export default {
    inject: ['foo'],
    props: {
      a: {
          default() {
              return this.foo
          }
      }
    },
    data() {
        return {
            b: this.foo
        }
    },
}

② 在Vue的2.5.0 版本之后,我們可以給選項(xiàng)值為對(duì)象形式的inject中的數(shù)據(jù)設(shè)置默認(rèn)值,使其在祖先組件中變成可選項(xiàng),即在不傳遞數(shù)據(jù)時(shí),后代組件依舊能正常工作。from屬性設(shè)置數(shù)據(jù)源,default屬性設(shè)置默認(rèn)值。

props設(shè)置默認(rèn)值類(lèi)似,如果直接將非原始值(復(fù)雜數(shù)據(jù)類(lèi)型)作為默認(rèn)值,那么它將成為所有子組件實(shí)例之間共享的引用,相互之間會(huì)產(chǎn)生影響。因此我們需要對(duì)非原始值(復(fù)雜數(shù)據(jù)類(lèi)型)使用一個(gè)工廠方法,以便于每次使用默認(rèn)值時(shí)都獲得一個(gè)新的副本,而不是共享同一個(gè)引用。

export default {
    inject: {
        // 當(dāng)組件內(nèi)名稱(chēng)與祖先組件的key相同時(shí),可省略form屬性
    	foo: { default: 'foo' },
        // 當(dāng)組件內(nèi)名稱(chēng)與祖先組件的key不同時(shí),需要通過(guò)form屬性指定對(duì)應(yīng)的數(shù)據(jù)
        bar: {
            from: 'barFather',
            default: 'bar'
        },
        // 對(duì)復(fù)雜數(shù)據(jù)類(lèi)型使用一個(gè)工廠方法
        arr: {
            from: 'arr',
            default: () => [1, 2, 3]
        },
  	},
    data() {
        return {}
    },
}

三、參考資料

Vue官方文檔

到此這篇關(guān)于Vue中的 mixins 和 provide/inject詳解的文章就介紹到這了,更多相關(guān)Vue mixins 和 provide/inject內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue項(xiàng)目如何使用$router.go(-1)返回時(shí)刷新原來(lái)的界面

    vue項(xiàng)目如何使用$router.go(-1)返回時(shí)刷新原來(lái)的界面

    這篇文章主要介紹了vue項(xiàng)目如何使用$router.go(-1)返回時(shí)刷新原來(lái)的界面問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue中實(shí)現(xiàn)Monaco Editor自定義提示功能

    vue中實(shí)現(xiàn)Monaco Editor自定義提示功能

    最近小編接到一個(gè)項(xiàng)目,需要在瀏覽器的ide中支持自定義提示功能,接下來(lái)通過(guò)本文給大家介紹在vue中實(shí)現(xiàn)Monaco Editor自定義提示功能,需要的朋友可以參考下
    2019-07-07
  • vue實(shí)現(xiàn)批量下載文件

    vue實(shí)現(xiàn)批量下載文件

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)批量下載文件的方法(不走后端接口的方法),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 基于vue封裝一個(gè)安全鍵盤(pán)組件

    基于vue封裝一個(gè)安全鍵盤(pán)組件

    大部分中文應(yīng)用彈出的默認(rèn)鍵盤(pán)是簡(jiǎn)體中文輸入法鍵盤(pán),在輸入用戶(hù)名和密碼的時(shí)候,如果使用簡(jiǎn)體中文輸入法鍵盤(pán),用戶(hù)的輸入記錄會(huì)被緩存下來(lái)所以我們需要一個(gè)安全鍵盤(pán),本文給大家介紹了如何基于vue封裝一個(gè)安全鍵盤(pán)組件,需要的朋友可以參考下
    2023-12-12
  • vue3.0父子傳參,子修改父數(shù)據(jù)的實(shí)現(xiàn)

    vue3.0父子傳參,子修改父數(shù)據(jù)的實(shí)現(xiàn)

    這篇文章主要介紹了vue3.0父子傳參,子修改父數(shù)據(jù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue3輸入無(wú)效路由跳轉(zhuǎn)到指定error頁(yè)面問(wèn)題

    vue3輸入無(wú)效路由跳轉(zhuǎn)到指定error頁(yè)面問(wèn)題

    這篇文章主要介紹了vue3輸入無(wú)效路由跳轉(zhuǎn)到指定error頁(yè)面問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • element?表格多級(jí)表頭子列固定的實(shí)現(xiàn)

    element?表格多級(jí)表頭子列固定的實(shí)現(xiàn)

    本文主要介紹了element?表格多級(jí)表頭子列固定的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue對(duì)于低版本瀏覽器兼容問(wèn)題的解決思路

    vue對(duì)于低版本瀏覽器兼容問(wèn)題的解決思路

    很多時(shí)候使用vue開(kāi)發(fā)的項(xiàng)目,由于無(wú)法在低版本瀏覽器上運(yùn)行,所以需要解決下,下面這篇文章主要給大家介紹了關(guān)于vue對(duì)于低版本瀏覽器兼容問(wèn)題的解決思路,需要的朋友可以參考下
    2023-02-02
  • vite創(chuàng)建vue3項(xiàng)目頁(yè)面引用public下js文件失敗解決辦法

    vite創(chuàng)建vue3項(xiàng)目頁(yè)面引用public下js文件失敗解決辦法

    Vue3相較于之前的版本有了不少變化,如引用全局Js文件,這篇文章主要給大家介紹了關(guān)于vite創(chuàng)建vue3項(xiàng)目頁(yè)面引用public下js文件失敗的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Vue3?echarts組件化及使用hook進(jìn)行resize方式

    Vue3?echarts組件化及使用hook進(jìn)行resize方式

    這篇文章主要介紹了Vue3?echarts組件化及使用hook進(jìn)行resize方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論