據(jù)動(dòng)點(diǎn)科技了解,2024年開(kāi)局的強(qiáng)勁表現(xiàn),得益于移動(dòng)端應(yīng)用程序下載量的持續(xù)增長(zhǎng),大型盛事的助推和活躍房源的增長(zhǎng)。
言:本文主要介紹愛(ài)彼迎在 iOS App 中應(yīng)用 SwiftUI 并替換原有 UI 框架的實(shí)踐
在構(gòu)建 App 的用戶界面(UI)時(shí),選擇合適的框架非常重要。正確的 UI 框架可以使應(yīng)用程序感覺(jué)流暢、響應(yīng)迅速,甚至令人愉悅,而不適合應(yīng)用程序需求的 UI 框架可能會(huì)讓人感覺(jué)遲緩,令人崩潰。這個(gè)原則對(duì)于開(kāi)發(fā)者的體驗(yàn)也同樣重要;一個(gè)具有良好 API 設(shè)計(jì)的 UI 框架可以使工程師流暢、高效且準(zhǔn)確地表達(dá)自己的想法,而一個(gè)具有錯(cuò)誤抽象或不一致 API 的框架可能會(huì)由于一些不必要的復(fù)雜性而使工程師的工作變得更加困難,低效。
在愛(ài)彼迎,我們希望我們的移動(dòng)端應(yīng)用可以提供世界一流的用戶體驗(yàn)和開(kāi)發(fā)者體驗(yàn)。基于這個(gè)愿望,我們?cè)?2016 年構(gòu)建了我們自己的 UI 框架:Epoxy。Epoxy 是一個(gè)聲明式的 UI 框架,工程師只需要描述在任一視圖狀態(tài)下想要什么樣的 UI 結(jié)構(gòu),框架會(huì)自動(dòng)更新視圖層次結(jié)構(gòu)并渲染頁(yè)面內(nèi)容。Epoxy 再使用 UIKit 來(lái)渲染視圖。
在 2019 年,隨著 SwiftUI 的推出,iOS 的 UI 框架格局發(fā)生了變化。SwiftUI 是第一個(gè)官方的聲明式 UI 框架,實(shí)現(xiàn)了與 Epoxy 類似的目標(biāo)。盡管在最初的三年里,SwiftUI 并不符合我們的需求,但到了 2022 年,它的穩(wěn)定性和 API 可用性得到了顯著提高。因此,我們開(kāi)始考慮在愛(ài)彼迎中采用 SwiftUI。
在這篇文章中,我們將分享為什么以及最終如何在愛(ài)彼迎中用 SwiftUI 替代了 Epoxy 和 UIKit。我們將詳細(xì)介紹如何將 SwiftUI 集成到愛(ài)彼迎的界面設(shè)計(jì)體系中,講解這項(xiàng)工作所帶來(lái)的成果,并列舉一些我們?nèi)栽诮鉀Q的挑戰(zhàn)。閱讀完這篇文章后,你將了解為什么 SwiftUI 已經(jīng)達(dá)到我們對(duì)用戶和開(kāi)發(fā)者體驗(yàn)的高標(biāo)準(zhǔn)。
評(píng)估和規(guī)劃使用 SwiftUI
切換到一個(gè)新的 UI 框架并不是一項(xiàng)輕松的任務(wù)。經(jīng)過(guò)調(diào)研,我們提出了以下假設(shè),即 SwiftUI 不會(huì)對(duì)用戶體驗(yàn)造成影響,并且會(huì)改善開(kāi)發(fā)者體驗(yàn),因?yàn)椋?/span>
基于這些,我們制定了一個(gè)計(jì)劃,分為三個(gè)階段來(lái)評(píng)估和應(yīng)用 SwiftUI:
截至發(fā)布本文時(shí),我們已經(jīng)成功完成了前兩個(gè)階段,而第三階段則需要等待 SwiftUI 增添靈活的導(dǎo)航 API。在組件(第一階段)和頁(yè)面(第二階段)階段,我們進(jìn)行了一個(gè)小規(guī)模的試點(diǎn)項(xiàng)目,工程師們可以通過(guò)報(bào)名嘗試使用 SwiftUI。我們通過(guò)收集試點(diǎn)項(xiàng)目反饋,來(lái)在進(jìn)入下一階段前來(lái)改進(jìn)對(duì) SwiftUI 的支持。這種方法使我們能夠在過(guò)程的每個(gè)階段都提供了價(jià)值,而不是從一開(kāi)始就為整個(gè)功能應(yīng)用 SwiftUI 而進(jìn)行大規(guī)模和不確定的基礎(chǔ)架構(gòu)重構(gòu)。
啟用 SwiftUI
我們?cè)诨A(chǔ)架構(gòu)和普及培訓(xùn)方面做了很多工作,以確保工程師們能夠成功遷移到 SwiftUI。
界面設(shè)計(jì)體系
為了加快在全公司范圍內(nèi)對(duì) SwiftUI 的應(yīng)用,對(duì)愛(ài)彼迎的界面設(shè)計(jì)體系提供一流的 SwiftUI 支持是一個(gè)關(guān)鍵且優(yōu)先的事項(xiàng)。我們并非只是簡(jiǎn)單地將現(xiàn)有的 UIKit 組件與 SwiftUI 橋接,而是重新構(gòu)建了 SwiftUI 中的界面設(shè)計(jì)體系,使其更加靈活和強(qiáng)大。
在我們的界面設(shè)計(jì)體系中,每個(gè)視圖組件都支持通過(guò)自定義樣式化來(lái)提高可重用性。我們有一系列的樣式協(xié)議,當(dāng)與自動(dòng)生成代碼結(jié)合使用時(shí),可以將樣式對(duì)象通過(guò) SwiftUI 環(huán)境注入來(lái)模擬 SwiftUI 內(nèi)置的樣式化范例。其中符合此協(xié)議的樣式被稱為“靈活樣式”。以下是一些示例代碼:
public protocol FlexibleSwiftUIViewStyle: DynamicProperty {
/// The content view type of this style, passed to `body()`.
associatedtype Content
/// The type of view representing the body.
associatedtype Body: View
/// Renders a view for this style.
@ViewBuilder
func body(content: Content) -> Body
}
該協(xié)議允許我們創(chuàng)建一個(gè)樣式對(duì)象,其中包含一系列可設(shè)置的屬性,可以完全自定義組件的渲染。樣式對(duì)象接收一個(gè)內(nèi)容對(duì)象,以使它在創(chuàng)建新的視圖體時(shí)可以訪問(wèn)視圖的底層狀態(tài)或交互行為,以下是一個(gè)數(shù)字步進(jìn)器的示例樣式實(shí)現(xiàn)(為了簡(jiǎn)潔起見(jiàn),省略了一些樣式設(shè)置):
public struct DefaultStepperStyle: DLSNumericStepperStyle {
public var valueLabel=TextStyle…
public func body(content: DLSNumericStepperStyleContent) -> some View {
HStack {
Button(action: content.onDecrement) { subtractIcon }
.disabled(content.atLowerBound)
Text(content.description)
.textStyle(valueLabel)
Button(action: content.onIncrement) { addIcon }
.disabled(content.atUpperBound)
}
}
}
默認(rèn)樣式的數(shù)字步進(jìn)器
有了這樣的靈活樣式協(xié)議,工程師只需編寫幾十行代碼,就可以添加一個(gè)完全定制的步進(jìn)器樣式。只需要實(shí)現(xiàn)一個(gè)符合 DLSNumericStepperStyle 的新類型即可。該樣式可以使用自動(dòng)生成的視圖修飾符設(shè)置在視圖上:
DLSNumericStepper(value: $value, in: 0...)
.dlsNumericStepperStyle(CustomStepperStyle())
自定義樣式的數(shù)字步進(jìn)器
由于在 DLSNumericStepper 視圖中實(shí)現(xiàn)了優(yōu)化的輔助功能支持,自定義樣式會(huì)自動(dòng)獲得適當(dāng)?shù)妮o助功能行為。我們?cè)诮缑嬖O(shè)計(jì)體系的實(shí)現(xiàn)過(guò)程中廣泛使用了這種靈活樣式的方法,使得產(chǎn)品工程師能夠快速構(gòu)建新的組件變體,而且不會(huì)出現(xiàn)輔助功能方面的問(wèn)題。
橋接 Epoxy
愛(ài)彼迎 App 的數(shù)千個(gè)頁(yè)面都是由 Epoxy 支持的。為了實(shí)現(xiàn)對(duì) SwiftUI 的無(wú)縫遷移,我們構(gòu)建了基礎(chǔ)設(shè)施,使 Epoxy 能夠?qū)?SwiftUI 視圖橋接到基于 UIKit 的 Epoxy 列表中,同時(shí)還能夠?qū)?Epoxy 的 UIKit 視圖橋接到 SwiftUI 中。
為了將 SwiftUI 視圖橋接到 UIKit 的 Epoxy 列表中,我們創(chuàng)建了一個(gè) itemModel 視圖修飾符,為 SwiftUI 視圖建立了 Epoxy 的標(biāo)識(shí)。在實(shí)現(xiàn)中,此方法將視圖包裝在 UIHostingController 中,并將其嵌入到集合視圖單元格中。這個(gè)工具使在現(xiàn)有的 Epoxy 頁(yè)面中采用 SwiftUI 變得非常簡(jiǎn)單,從而開(kāi)啟了我們?cè)?SwiftUI 試運(yùn)行的第一個(gè)階段。
SwiftUIRow(
title: "Row \(id)",
subtitle: "Subtitle")
.itemModel(dataID: id)
類似地,我們可以通過(guò)使用視圖擴(kuò)展來(lái)將 UIKit 視圖橋接到 SwiftUI 中,該擴(kuò)展可以使用視圖內(nèi)容、樣式約束和任何其他視圖配置從 UIKit 組件創(chuàng)建一個(gè) SwiftUI 視圖。在實(shí)現(xiàn)中,這個(gè)API 使用了一個(gè)泛型的 UIViewRepresentable,在內(nèi)容和樣式發(fā)生變化時(shí)自動(dòng)創(chuàng)建和更新 UIView。
EpoxyRow.swiftUIView(
content: .init(title: "Row \(index)", subtitle: …),
style: .small)
.configure { context in
print("Configuring \(context.view)")
}
.onTapGesture {
print("Row \(index) tapped!")
}
由于 SwiftUI 具有截然不同的布局系統(tǒng),正確布局一個(gè) UIKit 組件是一個(gè)挑戰(zhàn)。因此我們開(kāi)發(fā)了一種可配置的方法,自動(dòng)支持復(fù)雜的視圖,比如需要額外的布局過(guò)程來(lái)正確調(diào)整大小的 UILabel。
單向數(shù)據(jù)流
在使用 Epoxy 時(shí),我們發(fā)現(xiàn)利用單向數(shù)據(jù)流模式可以使我們的 UI 變得更加可預(yù)測(cè)和易于理解。我們構(gòu)建頁(yè)面,使 Epoxy內(nèi)容作為頁(yè)面狀態(tài)的函數(shù)來(lái)進(jìn)行渲染。用戶交互當(dāng)作行為被分派,并導(dǎo)致頁(yè)面狀態(tài)發(fā)生變化,進(jìn)而觸發(fā)頁(yè)面的重新渲染。我們使用 StateStore 對(duì)象來(lái)存儲(chǔ)頁(yè)面狀態(tài)并對(duì)行為進(jìn)行處理以改變?cè)摖顟B(tài)。為了將這種模式應(yīng)用到 SwiftUI,我們更新了 StateStore,使其符合 ObservableObject 協(xié)議,這使得 store 在狀態(tài)變化時(shí)可以觸發(fā)頁(yè)面中 SwiftUI 視圖的重新渲染。我們發(fā)現(xiàn)工程師們更喜歡繼續(xù)使用這種模式在 SwiftUI 中構(gòu)建頁(yè)面,因?yàn)樗箻I(yè)務(wù)和狀態(tài)變化邏輯與呈現(xiàn)邏輯分離。在很多情況下,我們能夠?qū)㈨?yè)面邏輯從 Epoxy 轉(zhuǎn)移到 SwiftUI 頁(yè)面而不需要進(jìn)行任何更改。為了說(shuō)明它們的相似性,這里是一個(gè)簡(jiǎn)單的計(jì)數(shù)器頁(yè)面在兩個(gè)視圖系統(tǒng)中的實(shí)現(xiàn):
// In Epoxy/UIKit:
struct CounterContentPresenter: StateStoreContentPresenter {
let store: StateStore<CounterState, CounterAction>
var content: UniListViewControllerContent {
.currentDLSStandardStyle()
.items {
BasicRow.itemModel(
dataID: ItemID.count,
content: .init(titleText: "Count \(state.count)"),
style: .standard)
.didSelect { _ in
store.handle(.increment)
}
}
}
}
// In SwiftUI
struct CounterScreen: View {
@ObservedObject
let store: StateStore<CounterState, CounterAction>
var body: some View {
DLSListScreen {
DLSRow(title: "Count \(store.state.count)")
.highlightEffectButton {
store.handle(.increment)
}
}
}
}
測(cè)試
為了確保產(chǎn)品的質(zhì)量,我們希望 SwiftUI 代碼在設(shè)計(jì)上具有可測(cè)試性。快照測(cè)試是我們測(cè)試視圖的主要方法,我們使用一個(gè)靜態(tài)定義來(lái)為我們的組件瀏覽器和快照測(cè)試服務(wù)提供命名的視圖變體:
enum DLSPrimaryButton_Definition: ViewDefinition, PreviewProvider {
static var contentVariants: ContentVariants {
DLSPrimaryButton(title: "Title") { … }
.named("Short text")
DLSPrimaryButton(title: "Title") { … }
.disabled(true)
.named("Disabled")
}
}
由于我們?cè)谶@里返回視圖變體,這可以在測(cè)試中具有很多靈活性 - 該框架接受任何內(nèi)容變體或視圖修飾符的組合。此外,我們使這些組件定義符合 SwiftUI 的 PreviewProvider 協(xié)議,并將這些內(nèi)容變體轉(zhuǎn)換為預(yù)期的返回類型,以便工程師可以使用 Xcode Previews 快速迭代組件。
與其他平臺(tái)上的聲明式 UI 框架不同,SwiftUI 沒(méi)有提供內(nèi)置的測(cè)試庫(kù)。為了支持對(duì)組件和頁(yè)面進(jìn)行行為測(cè)試,我們集成了開(kāi)源的 ViewInspector 庫(kù),并也對(duì)這個(gè)倉(cāng)庫(kù)貢獻(xiàn)了代碼。
培訓(xùn)
應(yīng)用 SwiftUI 的一個(gè)重大挑戰(zhàn)是在大型 iOS 團(tuán)隊(duì)中建立內(nèi)部的專業(yè)知識(shí)。為了積極應(yīng)對(duì)這個(gè)問(wèn)題,我們組織了多次為期半周的 SwiftUI 工作坊,幾乎有一半的 iOS 工程師參加了這些工作坊。參與者表示,他們 SwiftUI 基礎(chǔ)知識(shí)方面的自信程度提高了 37%,在構(gòu)建新組件方面的自信程度提高了 39%。此外,我們發(fā)現(xiàn),參加工作坊近一年后的人員的 SwiftUI 專業(yè)知識(shí)比沒(méi)有參加工作坊的人員高出了 8%。
SwiftUI 的相關(guān)發(fā)現(xiàn)
代碼行數(shù)
鑒于愛(ài)彼迎有數(shù)百萬(wàn)行的 iOS 代碼,我們對(duì) SwiftUI 減少構(gòu)建 UI 所需代碼量的潛力感到非常興奮。在我們進(jìn)行的一項(xiàng)早期實(shí)驗(yàn)中,我們重新編寫了評(píng)論卡片,并發(fā)現(xiàn)代碼行數(shù)減少了 6 倍 - 從 1121 行減少到僅剩 174 行代碼!在過(guò)去的兩年里,隨著我們對(duì) SwiftUI 的應(yīng)用不斷推進(jìn),我們看到了類似幅度的代碼行數(shù)減少。
性能
在評(píng)估 SwiftUI 時(shí),UI 性能是一個(gè)重要的關(guān)注點(diǎn)。幸運(yùn)的是,經(jīng)過(guò)多次實(shí)驗(yàn)驗(yàn)證,我們發(fā)現(xiàn)在使用 SwiftUI 時(shí)的頁(yè)面性能分?jǐn)?shù)與 UIKit 實(shí)現(xiàn)相當(dāng)。雖然在實(shí)例化 UIHostingController 時(shí)有一些小的開(kāi)銷,但通過(guò)向 Epoxy添加一個(gè)復(fù)用的 Hosting Controller 池,我們成功地減少了這個(gè)開(kāi)銷。
SwiftUI 的普及和開(kāi)發(fā)者滿意度
由于公司內(nèi)部對(duì) SwiftUI 的熱情,該框架的應(yīng)用進(jìn)展迅速。我們的 SwiftUI 組件構(gòu)建有限試點(diǎn)始于 2022 年 1 月,隨后于同年 5 月擴(kuò)大推廣。而對(duì)于完整頁(yè)面的 SwiftUI 構(gòu)建,試點(diǎn)階段在 2022 年 10 月開(kāi)始,然后于 2023 年 1 月正式推出。
截至九月,我們已經(jīng)擁有超過(guò) 500 個(gè) SwiftUI 視圖和大約 200 個(gè) SwiftUI 頁(yè)面。其中許多頁(yè)面都完全使用 SwiftUI 實(shí)現(xiàn),這些頁(yè)面已經(jīng)在愛(ài)彼迎 2023 年的夏季發(fā)布會(huì)的版本中使用。
愛(ài)彼迎產(chǎn)品中 SwiftUI 組件和頁(yè)面的增長(zhǎng)
愛(ài)彼迎的 iOS 工程師對(duì) SwiftUI 非常滿意。在最近的一次調(diào)查中,77% 的受訪者表示 SwiftUI 提高了他們的效率。許多受訪者提到,隨著更多使用 SwiftUI 的經(jīng)驗(yàn),他們的效率得到了進(jìn)一步提高,包括那些在一開(kāi)始認(rèn)為 SwiftUI 會(huì)降低他們開(kāi)發(fā)效率的人。調(diào)查中所有的受訪者都表示 SwiftUI 沒(méi)有對(duì)其產(chǎn)品功能的質(zhì)量產(chǎn)生負(fù)面影響,一些受訪者還表示 SwiftUI 提高了他們的代碼質(zhì)量。
挑戰(zhàn)
盡管整體上轉(zhuǎn)向 SwiftUI 已經(jīng)取得了重大成功,但我們也遇到了以下挑戰(zhàn):
總結(jié)
盡管面臨這些挑戰(zhàn),但在愛(ài)彼迎對(duì) SwiftUI 的謹(jǐn)慎應(yīng)用過(guò)程中,我們總體上的經(jīng)歷還算順利。通過(guò)重建我們的界面設(shè)計(jì)體系、重視培訓(xùn)普及,并提供與現(xiàn)有框架的無(wú)縫集成,我們提高了開(kāi)發(fā)速度和開(kāi)發(fā)者滿意度,同時(shí)保持了高質(zhì)量的標(biāo)準(zhǔn)。我們對(duì) SwiftUI 的持續(xù)發(fā)展并在我們的應(yīng)用中能支持更多的體驗(yàn)感到興奮!
作者:Bryn Bodayle
譯者:Jun Luan
來(lái)源:微信公眾號(hào):愛(ài)彼迎技術(shù)團(tuán)隊(duì)
出處:https://mp.weixin.qq.com/s/AokW7NZvjBT76iaRnEnsOA
ello,大家早上好,又是元?dú)鉂M滿的一天,先來(lái)瀏覽新鮮的早報(bào)吧~
【傳特斯拉將于1月維持上海工廠減產(chǎn)計(jì)劃】
據(jù)悉,特斯拉將于2023年繼續(xù)維持其在上海工廠的減產(chǎn)計(jì)劃。根據(jù)一份內(nèi)部時(shí)間表,特斯拉將在1月3日至19日期間生產(chǎn)17天,然后在月底停止生產(chǎn),以延長(zhǎng)農(nóng)歷新年假期。特斯拉此前曾否認(rèn)有關(guān)減產(chǎn)的報(bào)道,稱12月初報(bào)道的細(xì)節(jié)“不真實(shí)”。特斯拉沒(méi)有回應(yīng)就最新報(bào)道置評(píng)的請(qǐng)求。
【中國(guó)國(guó)航與國(guó)鐵集團(tuán)合作推出空鐵聯(lián)運(yùn)產(chǎn)品】
中國(guó)國(guó)際航空公司與中國(guó)國(guó)家鐵路集團(tuán)有限公司27日舉辦“融合發(fā)展暢行地空”中國(guó)國(guó)航與國(guó)鐵集團(tuán)合作暨空鐵聯(lián)運(yùn)產(chǎn)品發(fā)布會(huì)。發(fā)布會(huì)上,雙方對(duì)共同合作的項(xiàng)目進(jìn)行了發(fā)布,并介紹了全新推出的國(guó)航國(guó)鐵空鐵聯(lián)運(yùn)產(chǎn)品。未來(lái),雙方還將繼續(xù)在產(chǎn)品設(shè)計(jì)、便捷換乘、數(shù)據(jù)共享、服務(wù)保障、制度標(biāo)準(zhǔn)等領(lǐng)域深化合作,優(yōu)化完善,進(jìn)一步提升空鐵聯(lián)運(yùn)服務(wù)水平。
【榮耀CEO趙明:對(duì)明年的市場(chǎng)發(fā)展持謹(jǐn)慎樂(lè)觀態(tài)度】
榮耀CEO趙明發(fā)表對(duì)于明年市場(chǎng)的看法:今年對(duì)所有廠家和品牌來(lái)講都是壓力非常大的一年,各個(gè)廠家都在積極地調(diào)整,未來(lái)還是充滿希望的。對(duì)于后續(xù)市場(chǎng)的發(fā)展,總體是持謹(jǐn)慎樂(lè)觀的態(tài)度。
【申通快遞擬以4500萬(wàn)元~5500萬(wàn)元回購(gòu)股份】
申通快遞昨日還發(fā)布公告稱,公司擬使用自有資金通過(guò)集中競(jìng)價(jià)的方式回購(gòu)公司股份,回購(gòu)資金總額不低于4500萬(wàn)元且不超過(guò)5500萬(wàn)元(均含本數(shù)),回購(gòu)價(jià)格不超過(guò)15元/股(含本數(shù)),預(yù)計(jì)可回購(gòu)股數(shù)300萬(wàn)股-366.66萬(wàn)股,約占公司目前總股本的0.20%-0.24%。此次公司擬使用自有資金回購(gòu)部分股份用于股權(quán)激勵(lì)計(jì)劃或員工持股計(jì)劃。
【B站:第二、第三季度,豎屏視頻的日均播放量均同比增長(zhǎng)400%以上】
B站舉辦2022 AD TALK營(yíng)銷伙伴大會(huì)。據(jù)B站副總裁劉智介紹,過(guò)去一年,B站的商業(yè)化基建已逐漸完善,廣告效率大幅提升。B站上線了多種轉(zhuǎn)化能力,包括直播帶貨、UP主藍(lán)鏈帶貨、活動(dòng)頁(yè)、下載頁(yè)等,為品牌提供從曝光到轉(zhuǎn)化的完整鏈路。其中,Story-Mode豎屏視頻廣受用戶歡迎,2022年第二、第三季度,豎屏視頻的日均播放量均同比增長(zhǎng)400%以上。豎屏視頻廣告互動(dòng)率是橫板廣告的五倍。
【最高法:不得以商品已拆封為由主張不適用七日無(wú)理由退貨制度】
最高人民法院27日發(fā)布關(guān)于為促進(jìn)消費(fèi)提供司法服務(wù)和保障的意見(jiàn)。意見(jiàn)明確,消費(fèi)者因檢查商品的必要對(duì)商品進(jìn)行拆封查驗(yàn)且不影響商品完好,電子商務(wù)經(jīng)營(yíng)者不得以商品已拆封為由主張不適用七日無(wú)理由退貨制度。
【愛(ài)彼迎中國(guó)發(fā)布2023年“開(kāi)春”計(jì)劃】
愛(ài)彼迎官方新聞賬號(hào)發(fā)布消息,“乙類乙管”總體方案官宣,2023年1月8日起取消入境后集中隔離。借此契機(jī),Airbnb愛(ài)彼迎發(fā)布2023年出境游“開(kāi)春”計(jì)劃,助力中國(guó)出境游復(fù)興。據(jù)介紹,2023年出境游“開(kāi)春”計(jì)劃主要分為5部分。首先,在供給端,愛(ài)彼迎全球超600萬(wàn)個(gè)活躍房源和體驗(yàn)已翹首以待中國(guó)旅行者的到訪。
【天貓首次取消跨店滿減,改為價(jià)格直降】
天貓?jiān)谄湟荒暌欢鹊哪曦浌?jié)活動(dòng)中,首次取消了“跨店滿減”,改為所有活動(dòng)商品采用“官方立減”的價(jià)格直降方式,不需湊單即可享受優(yōu)惠。從今年618開(kāi)始,天貓?jiān)噲D簡(jiǎn)化其面向用戶的優(yōu)惠玩法,陸續(xù)取消了定金膨脹、指定疊加條件折扣、滿減等。