最近快毕业了呜呜呜,准备找工作,但是缺乏项目经验,于是就在B站找相关的课程,学完之后便根据老师稳定的教导,以及自己稳定的心态,做了一个类似于蘑菇街的电商APP。(后端数据接口由老师提供,老师叫coderwhy,前端讲得真的很不错)。附上项目码云地址:https://gitee.com/wu_yuxin/SuperMall.git如果觉得有用的话,麻烦点个星星,拜托了(╥╯^╰╥)。预备知识与后续知识及项目案例HTML入门与进阶以及HTML5CSS JS-上JS-下jQueryNode.js + Gulp 知识点汇总MongoDB + Express 入门及案例代码Vue 知识点汇总(上)–附案例代码及项目地址Vue 知识点汇总(下)–附案例代码及项目地址蘑菇街作为中国最大女性购物社区,其APP的设计水平也毋庸置疑的(1)准备工作在阅读大神的博客时有人问里面使用的美工素材怎么得到的,其实很简单,下载一个APP,把APK格式修改成rar后解压,你会在目录下看到所有的素材。(2)开始工作项目目录:由于是自己的练手之作,所以,莫得启动页面下面是首页:详情页分类页个人页面:一. FeatureView独立组件封装FeatureView
div>a>img二. TabControl独立组件的封装
props -> titlesdiv>根据titles v-for遍历 div -> span{{title}}css相关选中哪一个tab, 哪一个tab的文字颜色变色, 下面border-bottom
currentIndex
三. 首页商品数据的请求3.1. 设计数据结构, 用于保存数据goods: {pop: page/listnew: page/listsell: page/list}3.2. 发送数据请求在home.js中封装getHomeGoods(type, page)在Home.vue中, 又在methods中getHomeGoods(type)调用getHomeGoods(‘pop’)/getHomeGoods(‘new’)/getHomeGoods(‘sell’)
page: 动态的获取对应的page获取到数据: res
this.goods[type].list.push(…res.data.list)this.goods[type].page += 1goods: {pop: page1:/list[30]new: page1/list[30]sell: page1/list[30]}四. 对商品数据进行展示4.1. 封装GoodsList.vue组件props: goods -> list[30]v-for goods -> GoodsListItem[30]GoodListItem(组件) -> GoodsItem(数据)4.2. 封装GoodsListItem.vue组件props: goodsItemgoodsItem 取出数据, 并且使用正确的div/span/img基本标签进行展示五. 对滚动进行重构: Better-Scroll5.1. 在index.html中使用Better-Scrollconst bscroll = new BScroll(el, { })注意: wrapper -> content -> 很多内容1.监听滚动
probeType: 0/1/2(手指滚动)/3(只要是滚动)bscroll .on(‘scroll’, (position) => {})2.上拉加载
pullUpLoad: truebscroll .on(‘pullingUp’, () => {})3.click: false
button可以监听点击div不可以5.2. 在Vue项目中使用Better-Scroll在Profile.vue中简单的演示对Better-Scroll进行封装: Scroll.vueHome.vue和Scroll.vue之间进行通信
Home.vue将probeType设置为3Scroll.vue需要通过$emit, 实时将事件发送到Home.vue六. 回到顶部BackTop6.1. 对BackTop.vue组件的封装6.2. 如何监听组件的点击直接监听back-top的点击, 但是可以直接监听?
不可以, 必须添加修饰.native回到顶部
scroll对象, scroll.scrollTo(x, y, time)this.$refs.scroll.scrollTo(0, 0, 500)6.3. BackTop组件的显示和隐藏isShowBackTop: false监听滚动, 拿到滚动的位置:
-position.y > 1000 -> isShowBackTop: trueisShowBackTop = -position.y > 1000七. 解决首页中可滚动区域的问题 Better-Scroll在决定有多少区域可以滚动时, 是根据scrollerHeight属性决定
scrollerHeight属性是根据放Better-Scroll的content中的子组件的高度但是我们的首页中, 刚开始在计算scrollerHeight属性时, 是没有将图片计算在内的所以, 计算出来的告诉是错误的(1300+)后来图片加载进来之后有了新的高度, 但是scrollerHeight属性并没有进行更新.所以滚动出现了问题 如何解决这个问题了?
监听每一张图片是否加载完成, 只要有一张图片加载完成了, 执行一次refresh()如何监听图片加载完成了?
原生的js监听图片: img.onload = function() {}Vue中监听: @load=‘方法’调用scroll的refresh() 如何将GoodsListItem.vue中的事件传入到Home.vue中
因为涉及到非父子组件的通信, 所以这里我们选择了事件总线
bus ->总线Vue.prototype.$bus = new Vue()this.bus.emit(‘事件名称’, 参数)this.bus.on(‘事件名称’, 回调函数(参数)) 问题一: refresh找不到的问题
第一: 在Scroll.vue中, 调用this.scroll的方法之前, 判断this.scroll对象是否有值第二: 在mounted生命周期函数中使用 this.$refs.scroll而不是created中 问题二: 对于refresh非常频繁的问题, 进行防抖操作
防抖debounce/节流throttle(课下研究一下)防抖函数起作用的过程:
如果我们直接执行refresh, 那么refresh函数会被执行30次.可以将refresh函数传入到debounce函数中, 生成一个新的函数.之后在调用非常频繁的时候, 就使用新生成的函数.而新生成的函数, 并不会非常频繁的调用, 如果下一次执行来的非常快, 那么会将上一次取消掉
debounce(func, delay) {
let timer = null
return function (...args) {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
func.apply(this, args)
}, delay)
}
},
八. 上拉加载更多的功能loadMore(){
this.getHomeGoods(this.currentType);
this.$refs.scroll.refresh();
}
九. tabControl的吸顶效果9.1. 获取到tabControl的offsetTop必须知道滚动到多少时, 开始有吸顶效果, 这个时候就需要获取tabControl的offsetTop但是, 如果直接在mounted中获取tabControl的offsetTop, 那么值是不正确.如何获取正确的值了?
监听HomeSwiper中img的加载完成.加载完成后, 发出事件, 在Home.vue中, 获取正确的值.补充:
为了不让HomeSwiper多次发出事件,可以使用isLoad的变量进行状态的记录.注意: 这里不进行多次调用和debounce的区别9.2. 监听滚动, 动态的改变tabControl的样式问题:动态的改变tabControl的样式时, 会出现两个问题:
问题一: 下面的商品内容, 会突然上移问题二: tabControl虽然设置了fixed, 但是也随着Better-Scroll一起滚出去了.其他方案来解决停留问题.
在最上面, 多复制了一份PlaceHolderTabControl组件对象, 利用它来实现停留效果.当用户滚动到一定位置时, PlaceHolderTabControl显示出来.当用户滚动没有达到一定位置时, PlaceHolderTabControl隐藏起来.十. 让Home保持原来的状态10.1. 让Home不要随意销毁掉keep-alive10.2. 让Home中的内容保持原来的位置离开时, 保存一个位置信息saveY.进来时, 将位置设置为原来保存的位置saveY信息即可.
注意: 最好回来时, 进行一次refresh()非父子组件通信:https://www.jb51.net/article/132371.htm我们在用Vue进行前端开发的时候,往往会遇到有很多个组件内,他们都有类似的data,类似的方法。这些大量重复的代码,如果正常编写出来,代码既不美观也不优雅,而且看起来也相当复杂。所以vue官方提供了一个极其好用的方式来解决这个问题那就是mixin先来看看官方的介绍
混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。
在Java开发中 如果我们遇到两个类有大量相似代码的时候,我们通常会定义一个父类,来讲这些重复代码写在一起,然后再让这两个类来继承父类的代码和方法。class Animal{
run(){}
}
class Person extends Animal{
//run(){}
}
class Dog extends Animal{
//run(){}
}
而在Vue中,每个组件export出来的是对象,所以不能像类那样继承,于是Vue提供了类似于类的继承的方法 mixin使用方法,在这里贴上自己项目的部分代码。定义一个mixin.js 文件import {debounce} from './utils';
export const itemListenerMixin = {
data(){
return {
itemImgListener: null,
}
},
methods:{
},
mounted(){
let newRefresh = debounce(this.$refs.scroll.refresh, 100)
this.itemImgListener = () => {
newRefresh()
}
this.$bus.$on('itemImgLoad', this.itemImgListener)
console.log("我是混入的东西")
}
}
mixin 里就跟一个正常的Vue的组件没有任何的区别,可以定义data,methods,生命周期函数等等。跟Java里面的父类和子类完全一样。只是调用的方法不一样而已。两个调用mixin.js的组件Detail.vueimport {itemListenerMixin} from "common/mixin";
mixins: [itemListenerMixin],
//其余代码均省略
Home.vueimport {itemListenerMixin} from "common/mixin";
mixins: [itemListenerMixin],
//其余代码均省略
只需要这样一小段代码,就可以调用到mixin.js 内定义的组件了。而且在两个组件内,作用完全一样当我们在组件上应用Mixin的时候,有可能组件与Mixin中都定义了相同的生命周期钩子,这时候钩子的执行顺序的问题凸显了出来。默认Mixin上会首先被注册,组件上的接着注册,这样我们就可以在组件中按需要重写Mixin中的语句。组件拥有最终发言权。当发生冲突并且这个组件就不得不“决定”哪个胜出的时候,这一点就显得特别重要,否则,所有的东西都被放在一个数组当中执行,Mixin将要被先推入数组,其次才是组件。const myMixin = {
mounted() {
console.log('mixin!')
}
}
new Vue({
el: '#app',
mixins: [myMixin],
mounted() {
console.log('Vue instance!')
}
});
//Output in console
> mixin!
> Vue instance!
//mixin
const myMixin = {
methods: {
sayHello: function() {
console.log('mixin!')
}
},
mounted() {
this.sayHello()
}
}
//vue instance or component
new Vue({
el: '#app',
mixins: [myMixin],
methods: {
sayHello: function() {
console.log('Vue instance!')
}
},
mounted() {
this.sayHello()
}
})
// Output in console
> Vue instance!
> Vue instance!
我们可以看到,当他们之间没有发生同名冲突的时候,两个都正常打印了。而当他们发生冲突之后。你可以看到这里打印了两个Vue instance。这是因为第一个函数被调用之后,并没有被销毁,而是被重写了。然后被调用了两次当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。选项合并数据对象(data)在内部会进行递归合并,在和组件的数据发生冲突时以组件数据优先。同名钩子函数(created,mounted…)将混合为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。值为对象的选项(methods, components 和 directives)将被混合为同一个对象。两个对象键名冲突时,取组件对象的键值对。需要注意的是
谨慎使用全局混入对象,因为会影响到每个单独创建的 Vue 实例 (包括第三方模板)。大多数情况下,只应当应用于自定义选项。也可以将其用作 Plugins 以避免产生重复应用
所以Vue对mixin 设定了 自定义选项合并策略
自定义选项将使用默认策略,即简单地覆盖已有值。如果想让自定义选项以自定义逻辑合并,可以向 Vue.config.optionMergeStrategies 添加一个函数:
Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {
// 返回合并后的值
}
对于多数值为对象的选项,可以使用与 methods 相同的合并策略:var strategies = Vue.config.optionMergeStrategies
strategies.myOption = strategies.methods
区域全面经济伙伴关系协定(RCEP)已于今年1月1日正式生效。首批生效的国家有文莱、柬埔寨、老挝、新加坡、泰国、越南等东盟6国和中国、日本、新西兰、澳大利亚等非东盟4国,共同推动达成的大型区域自贸协定,是目前全球经济体量最大的自由贸易区。RCEP生效,将给跨境电商带来什么实质好处?市场准入壁垒降低或取消!关税降低或实现零关税!跨境物流更快更便捷!原材料选择更多!……总而言之,RCEP是跨境电商加速发展的新契机、新“风口”!站在RCEP风口,跨境电商的2022年营销应该怎么搞?这就来给你们推荐十二个可以借鉴、实操的营销策略吧!一、结合各国节假日进行营销营销做得好,客户少不了!在节日期间,利用消费者的节日消费心理,综合运用网络广告、创意公演等营销手段,进行产品、品牌的推介活动,不仅可以提高产品的销售力,还可以提升品牌形象。在此,推荐一款神器:AI营销日历对RCEP国家节假日的展示清晰明了,还支持自建营销节点!注意:注册时需要选择“跨境电商”行业。它是2022年全行业营销日历,可以随营销热点自动更新,登录后可见行业订制内容,让你不错过任何一个营销节点!点击即可免费使用:二、追加销售“对这次升级感兴趣吗?”大多数人都听过这种形式的问题,这是一个追加销售的例子。根据数据显示,追加销售的效率是在线交叉销售的20倍。追加销售有两个关键:使加售与原始产品相关对客户可接受的价格范围敏感追加销售的好处:可以帮助增加售后体验提高复购率,更好地转化请记住,产品必须符合客户的原始需求,一旦他们考虑到原有价格,他们可能就不愿意付更多的钱。新产品必须真正优于原始产品。苹果官网对iPad的销售,就是个很好的范例:把现有的机型参数放在同一个页面供客户参考,这一行为无形中会促使客户花更多的钱买最好的配置。ProductUpSell能够在结账时根据客户购物车的内容提供不同的产品。也可以自定义它仅在购物车中的物品超过特定金额时才提供优惠。最后,可以使用它来执行买一送一促销。是一个最常见,也是使用最多的一种方式!三、Instagram营销社交电商已经成为必要的营销手段之一,在多极化的流量时代,任何一个方式都可以让你一战成名。Instagram营销的平均订单价值为65.00美元,这比除了Polyvore以外其他任何社交媒体平台都要高。此外,最近的一项研究发现,Instagram给品牌的参与度比其他任何社交媒体平台高25%。如果你使用正确的主题标签,适当的过滤器,并在合适的时间发布,长期坚持下去,那么你就可以在Instagram上获得一大批的关注者。掌握Instagram营销的关键是与用户互动。可以尝试投放广告吸引客户,建议展示使用产品的客户照片,这是向潜在客户展示品牌实力的机会。潜在客户看到你的产品经常被人们购买,并且做其他人正在做的事情,会感觉更舒服。Instagration是增加Instagram参与度的绝佳工具。它与你的在线商店集成,使你能够调整客户的Instagram照片并以不同的格式显示它们。通过展示你想要展示的内容,来帮你吸引更多的客户。四、减少被遗弃的购物车顾客在购物车中添加物品,但在结账时放弃是很常见的事情。根据BaymardInstitute的数据,67.45%的订单最后都会被放弃。想一想,这可能是你三分之一的销售额。是否有一种简单有效的方法可以减少放弃购买率?建议可以写一封邮件,诱使客户完成支付。你可以直接在Shopify管理员中执行此操作,我们还推荐以下应用:允许向放弃购物车的顾客发送邮件,提醒对方完成支付。操作非常简单。五、Facebook商店做独立站的都知道,这个就不用我多介绍了,Facebook是重要站外流量来源,已经是一个不争的事实!Facebook是另一个社交媒体营销的大平台。从Shopify的社交媒体营销信息图中可以看出,Facebook占据了社交媒体营销订单的大部分份额。Facebook不仅仅是一个很好的流量来源,还可以通过Facebook商店直接在Facebook上销售。它易于设置,是销售的绝佳渠道。更棒的是,它直接与Shopify商店联合,让客户更轻松地通过世界上最大的社交媒体平台与你联系。这是一个Facebook营销策略案例:FacebookStore是一款由Shopify开发的应用程序,可以让你直接在Facebook页面上展示和销售产品。客户可以与朋友们分享他们喜欢的产品。有一个很酷的功能:Like-gating,只允许“喜欢”你的Facebook页面的用户查看你的商店。六、捕获更多电子邮件订阅者电子邮件是在线营销中最好的渠道之一。它可以为你的商店带来流量,补充内容营销,并且是最普遍最传统的方式。根据最近的研究和调查表明:电子邮件的投资回报率约为4,300%(根据直销协会的说法)。80%的人表示他们每天都会收到营销信息以及他们的个人电子邮件。70%的人通过电子邮件了解到可以使用的优惠券或折扣。60%的人表示接收优惠信息是他们订阅企业电子邮件列表的首要原因。有很多推文和Facebook帖子可供我们收藏,但人们仍然会看发送到他们个人电子邮件的新消息。此外,电子邮件为你提供了一个空间,可以说出不适合社交媒体帖子的内容。这是一个营销策略案例:EmailPirate允许创建一个完全可自定义的选择性加入窗口,弹出窗口以鼓励你的访问者订阅你的电子邮件。可以将此客户列表下载到电子表格中,然后将其上传到你的电子邮件客户端。它还能够跟踪用户行为,以便你可以在选择之前根据客户的行为对客户进行细分。七、改进电子邮件活动 发送邮件的时间是有讲究的,每天早上、下午6点以后发送的邮件更有可能被客户浏览,定期发送的、针对客户特点发送的邮件更受客户欢迎。以下是一封优秀的营销策略案例:Emma能够根据购买历史记录定位你的客户,从而开展更好的营销活动。例如,细分市场是高价值的客户或者距离最近的客户。你还可以自动发送感谢和奖励电子邮件。最后,可以跟踪电子邮件产生的购买情况,以便即时评估特定电子邮件的价值。Emma是设计、交付和分析你的电子邮件活动的绝佳工具。八、发送心愿单提醒电子邮件最后一种类型的电子邮件供考虑:心愿单提醒。The Wish list Reminder Email就像Abandoned Cart Email的“老弟”,与Abandoned Cart Email密切相关。两者都旨在说服客户完成购买。有人已经更新了他的心愿单吗?有一件商品已经被列入了很多心愿单?它会很快售罄吗?发送电子邮件给客户,激发其购买欲望。Wishlist+Reminder应用程序是一种自动化心愿单电子邮件的简便方法。你可以在网站上自定义心愿单的外观,然后向人们发送电子邮件,提醒他们你的商店中有他们喜欢的内容等等。九、店铺设计如果你的店铺设计的很糟糕,那么你将失去客户。你的商店可能会受到以下各种因素的影响:缺乏明确的价值主张,产品描述太差。即使你已经改进了上述每个方面,你仍然可能会犯一些错误。是否正确上线产品或是否在页面上放置了太多产品?是不是堆砌了太多的文字或者图片?这些都是应该考虑的事情。还好有很多改善方法。如果商店的主题并不适合,请查看Shopify提供的其他一些主题。以下是精心设计的高转换率在线商店营销策略案例:有时即使完善了商店的设计,你仍然可能会失去那些感觉价格过高的顾客。EnterExitOffers可以在客户准备退出你的商店的时候弹出特价,提供折扣或免费送货服务。十、生成更多产品评论根据在线杂志InternetRetailer报道,可以通过向在线商店添加产品评论来将电子商务转换率提高14-76%。为什么?有两个原因:首先,社会证明:产品评论是一种推荐形式,客户可以看到人们对他们正在考虑购买的产品的看法。第二,搜索引擎优化:进行产品评论会增加页面上的内容量,并增加客户点击一些长尾关键字的可能性。好评能带来更好的转化率。刷评论的方式并不是一个长久的好办法,尽量获得客户的真实评价才是王道。十一、与你的访客互动你的ins页面够吸引人吗?你是否积极管理你的Facebook页面?在主页上使这些“关注”按钮更加突出。更积极地展示你的博客。每个电子商务商店都应该定期写博客,与粉丝互动并优化SEO排名。建议尝试产品促销,每个人都喜欢特价促销。利用客户爱占小便宜的心理往往能获得更多的销量。十二、做市场研究并预测未来销售如果有能力扩展产品线或添加新产品,那么需要评估市场需求,看看它是否值得去做。可以通过关键字研究,地理验证和查看社交媒体趋势来实现这一目标。把产品设置成缺货或者预售状态,并查看有多少人有购买的意向也是一个好办法。如果你正在考虑销售三件商品中的一件,可以把所有产品都上线,然后把它们的状态设置成缺货,并查看哪些产品最受关注,选择关注度最高的那个去卖。以下是一个营销策略案例:以上的营销方式,都离不开AI营销日历!对RCEP十国的节假日展示清晰明了,还支持自建营销节点!注意:注册时需要选择“跨境电商”行业。是跨境电商人不可错过的小工具!点击下方链接,即可使用AI营销日历-----------------------------------------营销策略案例还有非常多,只要找到了适合自己的营销方式,你也可以成为别人口中成功的营销策略案例。本文分享的营销策略案例到这里就结束了。RCEP风口正当时,抓住机遇,你就是领跑大牛!想要在tiktok上做东南亚跨境电商的朋友,可以来来看看这份资料如果你有更好的想法欢迎来一起交流!