首页

交互设计师常用的设计理论与心理学

ui设计分享达人

掌握好常用的设计理论与心理学知识,能帮助我们对用户的人性特征的拿捏,帮助我们较大的影响用户底层决策,以产品实现业务目标。

一、尼尔森10大可用性原则


1、状态可见原则

不局限于:用户的当前状态、知道当前任务要做什么、任务进度等。

2、环境贴切原则

设计要复合目标用户的认知,符合用户的心智模型,于是熟悉的事物越容易被用户所接受。

3、撤销重做原则

操作前可预知,操作中有反馈、操作后可撤销。

4、一致性原则

不局限于:业内产品的一致性、产品内的一致性、版本迭代间的一致性

5、防错原则

错误行动发生前,引导用户向正确的方向前进;用户触碰到危险操作时给予提示;危险操作发生之后,提供撤回的入口。

6、易取原则

通过使用对象、动作和选项的可视化表达,最大限度地减轻用户的记忆负担。

记住用户的操作记录、一个流程对应一个操作目标、提供适量的信息、选择而不是输入。

7、灵活原则

好的产品需要同时兼顾新用户和资深用户的需求。对新用户来说,需要功能明确、清晰,对于老用户需要快捷使用高频功能。不可迎合某一种用户,把不必要的信息占据重要部分。

8、易扫(读)原则

不要包含不相关或低频次的信息/操作。页面中的每个额外信息都会降低主要内容的相对可见性。

产品设计的四大基本原则:亲密性、对齐、重复、对比。

9、容错原则

错误信息应该用通俗易懂的语言表达,较准确地指出问题,并且提出解决方案。避免通过代码等用户难以理解的形式

即:提供解决方案、帮助用户从错误中恢复

10、人性化帮助

如果系统能让用户不需要阅读文档就会使用那是最好的,但通常情况下还是需要帮助文档的。任何信息应该容易被搜索,且专注于用户的目标任务,并列出具体的步骤来告知用户。


二、费茨定律

翻译成人话就是:

1. 按钮做大点(W大点)更易于点击

2. 将按钮放置在离开始点较近的地方

3. 相关按钮之间距离近点(D小点)更易于点击

4. 屏幕的四角与四边是「无限可选中」位置(非移动端)

5. 通过费茨定律的反向使用,可以降低按钮被点击的可能


三、米勒定律


米勒定律预测人的工作记忆能够记住的项为7(±2)个。1956年认知心理学家乔治·米勒发表了一篇论文,他讨论了短期记忆和记忆跨度的极限。

不要乱用 “神奇的7” 为设计进行不必要的限制;

将内容整理为较小的单元,以便用户轻松地处理、理解和记忆。


比如电话号码的显示方式、银行卡的显示方式等


四、接近法则


观察者看到彼此邻近(空间或时间)的物体时,会将它们视为一个整体。

在界面设计中,对信息的组织已经离不开这个法则了,他在界面中所体现的就是把相关的信息块组合在一起,不太相关的分离开,增强与区分元素之间的关联性,所强调的是空间和位置。

接近法则产生于群组,它可以减少信息设计的复杂性,对引导用户的视觉流、便于用户对界面的解读起到至关重要的作用。


五、席克定律


希克定律是一种心理物理学定律。用户所面临的选择数量越多,做出选择所花费的时间就越长,在人机交互的界面中选项越多,意味着用户做出决策的时间越长。


六、泰斯勒定律(复杂性守恒定律)


泰斯勒定律又称复杂性守恒定律,该定律认为每一个过程都有其固有的复杂性,这个复杂性存在一个临界点,超过了这个点就不能再简化了,你只能将固有的复杂性从一个地方移动到另外一个地方。


七、奥卡姆剃刀原理


奥卡姆剃刀原理的核心思想为:“切勿浪费较多东西去做用较少东西同样可以做好的事——如无必要,勿增实体,即简单有效原理”。


八、防错原则


操作前有提示,操作中有反馈、操作后可撤销。


九、损失厌恶


损失厌恶是指人们面对同样数量的收益和损失时,认为损失更加令他们难以忍受。同量的损失带来的负效用为同量收益的正效用的2.5倍。损失厌恶反映了人们的风险偏好并不是一致的,当涉及的是收益时,人们表现为风险厌恶;当涉及的是损失时,人们则表现为风险寻求。


十、安慰剂效应


“安慰剂效应”指的是,对于某种无效的疗法或干预手段,仅仅是“相信它有效”,就能改善健康,并能改变认知


十一、多尔蒂门槛


研究结果表明,计算机的响应速度直接影响了使用者做出下一个决定所要花费的时间(这个时间被称为用户响应时间),换句话说,计算机相应的时间越长,用户就要花费越多的时间来思考和决定下一步的操作。


合理的操作响应时长、方式有助于用户保持专注和提率。

软件操作的过度动画时间不宜太短或太长,最常见于 400ms 左右。

如果无法避免操作中较长读取、等待时间,那么就用其他更有趣的动画、页面来减少用户的焦虑感。


十二、马斯洛需求层次理论


马斯洛需求层次理论是人本主义科学的理论之一,由美国心理学家亚伯拉罕•马斯洛在1943年在《人类动机理论》论文中所提出。书中将人类需求像阶梯一样从低到高按层次分为五种,从低到高依次是:生理需求、安全需求、社交需求、尊重需求和自我实现需求。

但最终马斯洛添加求知需求和审美需求,自此马斯洛需求层次理论最终定型为8层。

十三、格式塔心理学


格式塔原则描述了当某些条款和条件被应用时,人类大脑如何感知视觉成分。它帮助大脑创造视觉的意象。因此,格式塔原则基于六个主要类别:

位置和位置;

接近;

对称与秩序;

类似;

关闭;

连续性。


十四、自我参照效应


第一种是精细加工说:在记忆过程中,这些事物在头脑中被进行了精细加工,与头脑中的已有知识之间建立了更多的联系,因此回忆时的提示线索更多,回忆效果更好。

第二种是组织加工说:于自我的知识是头脑中存在的一种结构良好的组织体系,它对与自己相关的事物有更好的固着作用;同时,由于自我知识常常被激活,因此与之相关的信息也更容易被相应地激活起来,这样回忆起来也就更容易。

第三种是双过程说:即自我参照任务能提高记忆的机制既包括精细加工因素,也有组织作用的参与

广告商会挖空心思的建立商品和你的关联,告知我们如果你购买了我的商品,你就会获得怎样的好处。而自媒体人则在标题上尽量简明扼要的说明,我要说的事情和你密切相关,不看就亏了。所以,稍微有深度的文章在快餐式的自媒体平台中反而阅读量不高,这是因为文章标题所涵盖的内容可能只和少部分人有关。


十五、上瘾模型


1、触发:提醒人们采取下一步行动


触发分为外部触发与内部触发

外部触发又分为:

付费型触发、回馈型触发、人际型触发、自主型触发。

内部触发

内部触发通过用户记忆存储中的各种关联来提醒他们采取下一步行动。

比如饿了的时候想起饿了么,想健身的时候想起keep


2、行动:人们在期待酬赏时的直接反应


福格行为模型可以用公式来呈现,即B=MAT。B代表行为,M代表动机,A代表能力,T代表触发。要想使人们完成特定的行为,动机、能力、触发这三样缺一不可。 否则,人们将无法跨过“行动线”,也就是说,不会实施某种行为。

比如说中午十一点你饿了想到饿了么订餐但是由于你的手机没电了定不了餐,中午要吃饭是动机,订餐想到叫饿了么外卖是触发,能够用手机订餐是能力,但是因为手机没有电 你就缺乏了相应的能力所以这个行为就没法完成。(当然你也能用朋友的手机订餐,这里只是举个例子)


福格总结了简洁性所包含的6个元素 ,即影响任务难易程度的6个要素,它们是:


  • 时间——完成这项活动所需的时间。

  • 金钱——从事这项活动所需的经济投入。

  • 体力——完成这项活动所需消耗的体力。

  • 脑力——从事这项活动所需消耗的脑力。

  • 社会偏差——他人对该项活动的接受度。

  • 非常规性——按照福格的定义,“该项活动与常规活动之间的匹配程度或矛盾程度”。


四种非常规的效应刺激动机:


  • 稀缺效应:(限量1000件)

  • 环境效应:(同一款啤酒在便利店和高档就把价格不一,但人们愿意为价格买单)

  • 锚定效应:(瑞幸咖啡定价24元的拿铁对标星巴克的32元拿铁)

  • 赠券效应:(利益进度吸引用户动机)


3多变的酬赏:满足用户的需求,激发使用欲


多变性会使大脑中的伏隔核更加活跃,并且会提升神经传递素多巴胺的含量,促使我们对酬赏产生迫切的渴望。 研究测试表明,当赌博者赢了钱,或是异性恋男性看到美女的图片时,大脑伏隔核中的多巴胺含量会上升。

多变的酬赏主要表现为三种形式:社交酬赏、猎物酬赏、自我酬赏。那些让我们欲罢不能的习惯养成类产品或多或少都利用了这几类酬赏。


社交酬赏

所谓社交酬赏,是指人们从产品中通过与他人的互动而获取的人际奖励。比如微信的点赞评论、站酷的推荐,用户能够获得社交的认同。


猎物酬赏

猎物酬赏,是指人们从产品中获得的具体资源或信息。


自我酬赏

所谓自我酬赏,是指人们从产品中体验到的操控感、成就感和终结感。


4、投入:通过用户对产品的投入,培养忠实用户


要想让用户产生心理联想并自动采取行动,首先必须让他们对产品有所投入。


用户对某件产品或某项服务投入的时间和精力越多,对该产品或服务就越重视。事实上,有充分证据表明,用户投入的多寡与其热爱某项事物的程度成正比。


1、文饰效应心理


(1)我们总是高估自己的劳动成果。

(2)我们总是尽力和过去保持行为一致。

(3)我们总是避免认知失调。


2、点滴投入


(1)储存价值

(2)内容

(3)数据资料

(4)关注者

(5)信誉

(6)技能


3、加载下一个触发


用户投入的同时也可以通过加载下一个触发的令自己重新开始上瘾循环,从而增加了进入上瘾循环的可能性。


十六、雅各布定律


雅各布定律(简称雅各布互联网用户体验法则),它指出如果用户已将大部分时间花费在某个网站上,那么他们会希望你的网站可以与那些他们已熟悉的网站一样拥有相似的使用模式。


我们在与新事物互动的过程中,用户使用的是以往的经验


对设计师来说,我们可以匹配用户的心智模型来改善体验。因此,用户可以轻松地将已有经验从一种产品或体验转移到另一种上,无需额外了解新系统的工作原理。

当设计师与用户的心智模型一致时,良好的用户体验就得以实现。


十七、KANO模型


KANO模型大家可以看看这个童鞋的总结很详细

https://www.zcool.com.cn/article/ZMTAyMjQ3Mg==.html


十八、古藤堡表图表法


人们在浏览页面或布局时视线趋于从左上角移动到右下角

古腾堡图表法说明我们观看页面的视线并不是镜面对称的,我们需要在设计中避免出现此类错误但绝不是墨守成规,将页面的 Logo放置在左上角而主体向右下角延伸,左下和右上作为视觉的盲点可以添加辅助元素


十九、尼尔森F型视觉模型


尼尔森F型视觉模型由 Jakob Nielsen于2006年提出

他指出,我们在第一次观看页面时,视线会呈 F的形状关注页面。
1.先从顶部开始从左到右水平移动。
2.目光再下移开始从左到右观察但是长度会相对短些。
3.以较短的长度向下扫视,形成一个 F形状,此时我们的阅读速度较慢,更为系统和条理性。


二十、序列效应


1.在列举信息时,排在最前和最后的元素,比排在中间的更容易让人记住。

2.对排在开头的信息产生加强的回想效果,称为:初始效应,人们有时候会把最前面的信息储存在长期记忆中。排在结尾的信息产生加强的回想效果,称为:时近效应。时近效应适用于听觉刺激。初始效应适用于视觉刺激。

3.在列举信息元素时,如果列举信息属于视觉性,那么把重要的信息放在最前面;如果是听觉性,就放在最后面。如果是用户必须做决定,并且是最后一项出现后马上做决定,那么就将想要用户做决定的信息放置最后,以便增加获选概率,否则放在最前面。

4. 应用例子:比如在很多app产品设计时,个人账户与设置基本放在页面的最前面和最后面,这体现着产品信息的序列关系,重要次序,所以在进行设计时,可以在信息排序上遵循序列效应。 当然还有一些产品想对用户进行引导操作,也可以利用这个法则,将信息放置最前或最后。

转自:站酷-YELLOW_J 

啥?你说我不懂如何设计消息中心?

ui设计分享达人

消息中心设计样式的简单汇总

作为APP标配的消息中心,我们无时无刻不在与其打交道,看似千篇一律的设计实际上其中也有许多值得我们深入探讨的内容,今天我们一起从消息中心页入口出发,一层一层剥开它的秘密。


全文分为五个部分:

一、消息中心页入口位置

二、消息中心页常见的组成模块

三、消息中心页分类导航方式的选择

四、消息列表的呈现形式

五、划重点


一、消息中心页入口位置


消息中心页是应用内系统发送给用户的各种信息的一个集合页面,它的本质是与用户互动沟通。也就是说,产品越是需要与用户进行沟通,消息中心的重要程度也就越高。


一般情况下,不同类型的APP消息中心的重要程度为:社交通讯类>电商类>资讯类>工具类


而消息中心页的入口位置正好侧面反映了其在产品中的重要程度。


1.底部导航栏

消息中心页入口位置放在底部导航栏,属于一级导航,重要程度很高,常见于即时通讯、社交社群类产品,如下图:

即时通讯类的QQ,核心业务就是通讯交流,消息页入口不仅放在底部导航栏,且做为APP的首页。而微博作为最早的社群内容类产品,社交沟通需求也很高,固将消息中心入口放置在底部导航栏。


当然也不是只有社交通讯类产品会选择该位置作为消息中心的入口,如下图淘宝和小红书也将消息中心入口放置在底部导航栏。

淘宝本是电商类产品,消息入口放置在底部导航栏,结合官方号、内容号、小黑群等功能,我的理解是淘宝是想通过社交沟通促使用户更多的购物。


小红书主打生活内容分享,辅助电商购物,是现在比较常见的某个核心业务+社交的产品,这类产品可根据自身一级导航类别的多少决定是否将消息中心入口放置在底部导航栏。


2.顶部导航栏

消息中心页入口放置在顶部导航栏,重要程度根据入口跟随页面的多少分成两种情况:


1)几乎每页跟随,重要程度较高

京东和豆瓣几乎是每个一级页面的顶部都有消息页入口图标,京东甚至在一些二级页面也还保留了顶部消息入口,方便用户随时查看。


2)仅在动态页、首页或个人中心顶部有入口,重要程度较低

如上图所示,爱奇艺的消息入口仅出现在泡泡页面的顶部,KEEP的消息入口在个人中心页的顶部,二者都只有一个入口。


3.个人中心页

消息中心页入口放置在个人中心页除顶部外的区域,重要程度一般,某些APP会在个人中心消息入口直接对其分类展示,用户能快速地到达想去的消息分类。

波洞的消息中心入口在个人中心页就分好了类别,用户点击进入对应的类别,消息页内部没有做类别的划分,相比放一个消息图标入口在个人中心顶部,更加直观。


入口不一定只有一个,三种情况混合使用也是可以的,重点是方便用户,引导用户。即便入口位置本身不显眼,加上红点数字后一样会被用户看到的。



二、消息中心页常见的组成模块


消息中心页的主要组成模块有:分类消息导航、消息列表;辅助组成模块有:搜索区、全部已读、消息设置、通讯录等。


1.主要的组成模块

消息中心的主要组成模块中消息列表是必不可少的(有些在下一级界面中),分类消息导航根据消息类别的多少不一定都有。


前文对消息中心的定义说过:消息中心页是应用内系统发送给用户的各种信息的一个集合页面。集合页面意味着消息本身被划分成了各种类型,这时候适合的分类消息导航能帮助用户快速找到需要的信息。


消息列表引导用户进入消息详情页,做为整个消息中心的核心,需要设计师根据产品需求尽可能多的考虑到囊括的信息类型,从而选择合适的消息列表呈现形式。


在第三部分中会着重介绍4种不同的分类消息导航,第四部分介绍3种不同的消息内容呈现形式。


2.辅助组成模块

所谓辅助的组成模块,就是不一定所有消息中心都有的,要结合产品实际情况增减。主要包括搜索区、全部已读、消息设置、通讯录等。

上图中微博的消息中心基本包括了所有的辅助组成模块,用户可以收发消息,设置消息,搜索消息,形成了针对消息功能的一个闭环。像微博这种消息功能重要,类别多,有社交属性的产品加入这些辅助功能是合适的,但不适合所有产品。


1)搜索区

用来在消息中心页搜索消息、联系人、群聊等的,仅适合消息中心页用户之间互动频繁的产品,如即时通讯类、聊天频繁的社群类产品。搜索区是全局搜索的根据产品自身性能选择加入。


2)全部已读/一键清除

对于用户体量不算大,消息沟通还不太频繁的产品可以不加。但对于消息沟通频繁的产品,不加的话,可能会逼死强迫症......


3)消息设置

用来设置消息提醒方式或屏蔽消息推送,大部分产品会将此功能放入设置中避免用户关闭消息推送,放在消息中心虽可增加用户体验,但也方便了用户直接屏蔽消息。


4)通讯录/发起聊天

常见在有好友通讯录体系或关注粉丝体系的产品中。



三、消息中心页分类导航方式的选择


消息中心分类导航方式主要有四种:顶部固定图标导航、顶部Tab导航、列表导航、顶部Tab混合导航,接下来通过分析它们各自的优缺点帮助你选择合适的消息中心分类导航方式。


1.顶部固定图标导航

顶部固定展示重要的3~5个消息类别,消息列表按照发送的时间顺序依次展示。

优点:可以突出重点消息类别。


缺点:类别切换不方便,需要返回上一级重新进入;超过5个类别后,其他类别只能归入消息列表中。


2.顶部Tab导航

顶部纯文字标签Tab导航,消息类别以标签的形式出现,可左右切换。

优点:切换方便,类别可拓展性强,占据空间小,为消息列表留出更多的空间,纯文字标签设计所需时间成本小。


缺点:分类标签不要超过9个,过多的标签用户切换到后面的成本较高,容易被忽略。


3.列表导航

消息中心列表导航有分类列表导航和混合列表导航两种形式。


1)分类列表导航

分类列表导航将不同的消息类别按照icon+文字的形式从上至下展示,左侧是消息类别,右侧是消息未读红点提醒,每一个列表对应进入一种消息类别。

优点:类别可拓展性强,分类清晰,设计简洁明了,适合轻量、极简风的消息中心页。


缺点:到达具体消息内容的路径较长,不适合复杂的消息中心页。


2)混合列表导航

消息列表与消息类别混合,按照消息发布时间顺序以列表形式展示,常见于重社交、即时通讯类产品。

优点:可拓展性极强,能容纳各种类别的消息。


缺点:消息内容太多后查找麻烦,需要配合搜索区使用,易产生阅读疲劳。


4.顶部Tab混合导航

顶部Tab混合导航,进一步对消息类别细致划分,一级Tab标签一般会划分为两部分:通知及消息/私信,通知一般是产品发送的一些系统消息或推送,消息一般是用户与用户之间的互动消息(包括官方号的信息),私信主要是有关注粉丝体系的产品的分类。二级内容根据需要选择进一步分类导航,如下图:

优点:将消息做了更细致的划分


缺点:有二级分类的页面占的空间大,消息列表展示空间少。



四、消息列表的呈现形式


消息列表是消息中心的核心,我们需要根据内容类型的不同选择合适的呈现形式,便于用户理解。主要的呈现形式有3种,分别是:icon/头像+缩略内容列表、图文列表、纯文字列表。


1.icon/头像+缩略内容列表

最常见的一种消息列表,以icon或头像+缩略内容的形式展示,符合从左到右的浏览习惯,能承载多种类型的消息,包括对话聊天类、订阅号、官方活动、系统通知等等,需要引入下一级页面展示消息详情。适合大部分的产品。


2.图文列表

消息列表采用图文形式,对用户更具吸引力,一般用在消息类别比较单一的消息中心。常见的有上图下文卡片(大图)和左图右文的展现形式。需要注意的是上图下文(大图)的展现形式对图片质量要求较高。常用在活动消息、资讯消息。


3.纯文字列表

消息列表以纯文字形式展示,形式较单一,能展示较多的文字信息,常见于通知消息。



五、划重点


本文主要通过消息入口位置、消息中心页组成、消息中心页分类导航选择、消息列表呈现形式介绍了消息中心页的设计。


消息中心页入口:底部导航栏、顶部导航栏、个人中心页


消息中心页组成模块:分类消息导航、消息列表;、搜索区、全部已读、消息设置、通讯录。


消息中心页分类导航:顶部固定图标导航、顶部Tab导航、列表导航、顶部Tab混合导航。


消息列表的呈现形成:icon/头像+缩略内容列表、图文列表、纯文字列表。

转自:站酷-人類君 

小程序入门到精通:了解小程序开发4个重要文件

前端达人

点击查看原图


1. 小程序没有DOM对象,一切基于组件化

2. 小程序的四个重要的文件

  • *.js —> view逻辑 —> javascript
  • *.wxml —> view结构 ----> html
  • *.wxss —> view样式 -----> css
  • *. json ----> view 数据 -----> json文件

注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名。

2.1 WXML

WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件事件系统,可以构建出页面的结构。WXML 充当的就是类似 HTML 的角色
要完整了解 WXML 语法,请参考WXML 语法参考

2.2 WXSS

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式。

WXSS 用来决定 WXML 的组件应该怎么显示。

为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。

与 CSS 相比,WXSS 扩展的特性有:



尺寸单位

样式导入

2.3 json

JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色。



全局配置

小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。



页面配置

每一个小程序页面也可以使用同名 .json 文件来对本页面的窗口表现进行配置,页面中配置项会覆盖 app.json 的 window 中相同的配置项。



工具配置 project.config.json

通常大家在使用一个工具的时候,都会针对各自喜好做一些个性化配置,例如界面颜色、编译配置等等,当你换了另外一台电脑重新安装工具的时候,你还要重新配置。

考虑到这点,小程序开发者工具在每个项目的根目录都会生成一个 project.config.json,你在工具上做的任何配置都会写入到这个文件,当你重新安装工具或者换电脑工作时,你只要载入同一个项目的代码包,开发者工具就自动

注意:

JSON文件都是被包裹在一个大括号中 {},通过key-value的方式来表达数据。JSON的Key必须包裹在一个双引号中,在实践中,编写 JSON 的时候,忘了给 Key 值加双引号或者是把双引号写成单引号是常见错误。

JSON的值只能是以下几种数据格式,其他任何格式都会触发报错,例如 JavaScript 中的 undefined。



数字,包含浮点数和整数

字符串,需要包裹在双引号中

Bool值,true 或者 false

数组,需要包裹在方括号中 []

对象,需要包裹在大括号中 {}

Null

还需要注意的是 JSON 文件中无法使用注释,试图添加注释将会引发报错。


2.4 js

一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击、获取用户的位置等等。在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作。


注册页面

对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等



使用 Page 构造器注册页面

简单的页面可以使用 Page() 进行构造。



使用 Component 构造器构造页面

Page 构造器适用于简单的页面。但对于复杂的页面, Page 构造器可能并不好用。

此时,可以使用 Component 构造器来构造页面。 Component 构造器的主要区别是:方法需要放在 methods: { } 里面。

————————————————

版权声明:本文为CSDN博主「前端岚枫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/yilanyoumeng3/java/article/details/106292742





2020年,令人惊叹的Echarts!

前端达人

点击查看原图


1.可视化面板介绍

应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。

01-技术要点

  1. div + css 布局
  2. flex 布局
  3. Less
  4. 原生js + jquery 使用
  5. rem适配
  6. echarts基础

02-案例适配方案

  1. 设计稿是1920px
  2. flexible.js 把屏幕分为 24 等份
  3. cssrem 插件的基准值是 80px
    插件-配置按钮—配置扩展设置–Root Font Size 里面 设置。
    但是别忘记重启vscode软件保证生效


03-页面主体布局

  1. header布局
  2. mainbox布局
  3. 公共面板模块 panel
  4. 柱形图 bar
因为我们今天的主题是echarts部分所以前面的这些,我就为大家写好框架,里面的布局相信以大家的能力都是分分钟解决的事情。


2.Echarts(重点)

echarts介绍

常见的数据可视化库:

D3.js 目前 Web 端评价最高的 Javascript 可视化工具库(入手难)
ECharts.js 百度出品的一个开源 Javascript 数据可视化库
Highcharts.js 国外的前端数据可视化库,非商用免费,被许多国外大公司所使用
AntV 蚂蚁金服全新一代数据可视化解决方案 等等
Highcharts 和 Echarts 就像是 Office 和 WPS 的关系

ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

官网地址:https://www.echartsjs.com/zh/index.html

echarts体验
下载echarts https://github.com/apache/incubator-echarts/tree/4.5.0

使用步骤(5大步骤):
1.引入echarts 插件文件到html页面中
2.准备一个具备大小的DOM容器

<div id="main" style="width: 600px;height:400px;"></div>

3.初始化echarts实例对象

var myChart = echarts.init(document.getElementById('main'));

4.指定配置项和数据(option)

var option = {
    xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
        type: 'value'
    },
    series: [{
        data: [820, 932, 901, 934, 1290, 1330, 1320],
        type: 'line'
    }]
};

5.将配置项设置给echarts实例对象


myChart.setOption(option);  


echarts基础配置

这是要求同学们知道以下配置每个模块的主要作用干什么的就可以了

series

系列列表。每个系列通过 type 决定自己的图表类型

大白话:图标数据,指定什么类型的图标,可以多个图表重叠。

xAxis:直角坐标系 grid 中的 x 轴

boundaryGap: 坐标轴两边留白策略 true,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间。

yAxis:直角坐标系 grid 中的 y 轴

grid:直角坐标系内绘图网格。

title:标题组件

tooltip:提示框组件

legend:图例组件

color:调色盘颜色列表

数据堆叠,同个类目轴上系列配置相同的stack值后 后一个系列的值会在前一个系列的值上相加。



option = {

    // color设置我们线条的颜色 注意后面是个数组

    color: ['pink', 'red', 'green', 'skyblue'],

    // 设置图表的标题

    title: {

        text: '折线图堆叠123'

    },

    // 图表的提示框组件 

    tooltip: {

        // 触发方式

        trigger: 'axis'

    },

    // 图例组件

    legend: {

       // series里面有了 name值则 legend里面的data可以删掉

    },

    // 网格配置  grid可以控制线形图 柱状图 图表大小

    grid: {

        left: '3%',

        right: '4%',

        bottom: '3%',

        // 是否显示刻度标签 如果是true 就显示 否则反之

        containLabel: true

    },

    // 工具箱组件  可以另存为图片等功能

    toolbox: {

        feature: {

            saveAsImage: {}

        }

    },

    // 设置x轴的相关配置

    xAxis: {

        type: 'category',

        // 是否让我们的线条和坐标轴有缝隙

        boundaryGap: false,

        data: ['星期一', '周二', '周三', '周四', '周五', '周六', '周日']

    },

     // 设置y轴的相关配置

    yAxis: {

        type: 'value'

    },

    // 系列图表配置 它决定着显示那种类型的图表

    series: [

        {

            name: '邮件营销',

            type: 'line',

           

            data: [120, 132, 101, 134, 90, 230, 210]

        },

        {

            name: '联盟广告',

            type: 'line',



            data: [220, 182, 191, 234, 290, 330, 310]

        },

        {

            name: '视频广告',

            type: 'line',

          

            data: [150, 232, 201, 154, 190, 330, 410]

        },

        {

            name: '直接访问',

            type: 'line',

          

            data: [320, 332, 301, 334, 390, 330, 320]

        }

    ]

};



3.Echarts快速使用

1.官网实例

点击查看原图



官网默认为我们提供了大量的案例,我们需要使用那一种只需要直接点击打开后复制他们的相关配置,然后按照我上面说的5大步骤进行使用即可。

2.社区Gallery

点击查看原图



官方自带的图例,可能在很多时候并不能满足我们的需要,在社区这里可以找到一些基于echart的高度定制好的图表,相当于基于jquery开发的插件,这里是基于echarts开发的第三方的图表。

本案例中使用了地图模拟飞行的案例就是从社区中进行引用的,
参考社区的例子:https://gallery.echartsjs.com/editor.html?c=x0-ExSkZDM (模拟飞机航线)
实现步骤:

第一需要下载china.js提供中国地图的js文件
第二个因为里面代码比较多,我们新建一个新的js文件 myMap.js 引入
使用社区提供的配置即可。
代码已经上传至我的码云如有需要的小伙伴可自行下载:
https://gitee.com/jiuyueqi/echarts

ps:最后呢,如果大家看完楼主的文章觉得对echarts的学习和了解有所帮助,麻烦大家路过点个赞点个关注呗!楼主后续还会继续更新有关前端方面的面试题资料或者其他方面的知识。
————————————————
版权声明:本文为CSDN博主「程序猿玖月柒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45257157/java/article/details/106300587

关于JavaScript获取时间函数及实现倒计时

前端达人

JavaScript数组对象的迭代方法详解

上一篇博客讲到了数组的方法,当然里边比较复杂的就是数组的迭代方法,因为涉及到了回调函数,所以这篇博客我们来详细讲解一下js数组迭代方法的使用。


1.forEach(funcrion(value,index,arr){}):对数组的每一项运行给定函数,这个方法不进行返回,所以一般用于让数组循环执行某方法。

  var arr=[1,2,3,4,5,6];

    arr.forEach(function(val,index,arr){

        console.log(val,index,arr);

    })

    // 其中:

    // value:每一个数组项的值 必填项

    // index:每一个数组项对应的索引

    // arr:当前的数组


注意:forEach()方法不返回值,所以回调函数中使用return会打印出来undefined

2.map(funcrion(value,index,arr){}):对数组的每一项运行给定函数,它将返回执行函数后的结果组成的新数组。

 var aNum2 = [1.2, 1.8, 2.0, 4.3];

    console.log(aNum2.map(Math.floor()));// [1,1,2,4]

    

    var arr=[1,2,3];

    console.log(arr.map(function(val,index){

        return val*3

    }));// 3 6 9

    // 其中:

    // value:每一个数组项的值 必填项

    // index:每一个数组项对应的索引

    // arr:当前的数组

注意:map()方法有返回值,返回值为新的数组,所以可以直接再回调函数中return

3.every(funcrion(value,index,arr){}):对数组的每一项都运行给定函数,进项判断,若对于每项执行函数都返回了true,则其结果为true。

 var arr=[10,20,30];

    console.log(arr.every(function(val){

        return val>20;

    }));// false

    

    console.log(arr.every(function(val){

        return val>0;

    }));// true

    

    // 其中:

    // value:每一个数组项的值 必填项

    // index:每一个数组项对应的索引

    // arr:当前的数组



注意:every()方法所有的数组项都符合判断时返回true,否则返回false。

4.some(funcrion(value,index,arr){}):对数组的每一项都运行给定函数,进行判断,若存在一项符合条件的数组项,则其结果为true。

    var arr=[10,20,30];

    console.log(arr.some(function(val){

        return val>20;

    }));// true

    

    console.log(arr.some(function(val){

        return val>0;

    }));// true

    

    console.log(arr.some(function(val){

        return val<0;

    }));// false

    

    arr.some(function(val){

        console.log(val<0);

    });//fasle false false

    // 其中:

    // value:每一个数组项的值 必填项

    // index:每一个数组项对应的索引

    // arr:当前的数组


注意:some()方法如果回调函数执行完会根据结果返回true或false,但是回调函数中打印判断是,只会作为判断条件的返回值,则会打印多遍。

5.fliter(funcrion(value,index,arr){}):对数组的每一项都运行给定函数,进行过滤,将符合条件的数组项添加到新的数组中,并返回新的数组。

   var aNum=[1,2,3,4];
    console.log(aNum.filter(function (num) {
        return num > 1;
    }));//[2,3,4,]
    aNum.filter(function (num) {
        console.log(num > 1);//true true true
    })

注意:filter()方法对数组项进行过滤,然后将符合条件的数组项添加到一个新的数组并返回,但是如果直接打印这个判断条件,相当于打印的判断条件的结果,只会返回true或者false。

6.ES6中新增的迭代方法

1.find():返回第一个符合传入测试(函数)条件的数组元素。


  var aNum=[10,20,30,40];

    console.log(aNum.find(function (num) {

        return num > 19;

    }));//1

    console.log(aNum.find(function (num) {

        return num < 0;

    }));//undefined



2.findIndex():返回符合传入测试(函数)条件的数组元素索引。


console.log(aNum.findIndex(function (num) { return num > 19; }));//3


3.includes():判断一个数组是否包含一个指定的值。

总结:

forEach()与map()是一对,用于数组遍历执行指定函数,前者不返回数组,后者返回 处理过的新数组。
every()与some()是一对,分别适用于检测数组是否全部满足某条件或者存在满足的数组项,返回true或false。
filter()则是相当于过滤器的存在,过滤掉数组中不符合条件的数据,将符合条件的数组项添加到新数组,并返回。
————————————————
版权声明:本文为CSDN博主「Mr_Han119」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39155611/java/article/details/106294417


了不起的 tsconfig.json 指南

seo达人

在 TypeScript 开发中,tsconfig.json 是个不可或缺的配置文件,它是我们在 TS 项目中最常见的配置文件,那么你真的了解这个文件吗?它里面都有哪些优秀配置?如何配置一个合理的 tsconfig.json 文件?本文将全面带大家一起详细了解 tsconfig.json 的各项配置。



本文将从以下几个方面全面介绍 tsconfig.json 文件:

了不起的 tsconfig.json 指南.png




水平有限,欢迎各位大佬指点~~


一、tsconfig.json 简介


1. 什么是 tsconfig.json

TypeScript 使用 tsconfig.json 文件作为其配置文件,当一个目录中存在 tsconfig.json 文件,则认为该目录为 TypeScript 项目的根目录。

通常 tsconfig.json 文件主要包含两部分内容:指定待编译文件和定义编译选项。



从《TypeScript编译器的配置文件的JSON模式》可知,目前 tsconfig.json 文件有以下几个顶层属性:


compileOnSave

compilerOptions

exclude

extends

files

include

references

typeAcquisition


文章后面会详细介绍一些常用属性配置。



2. 为什么使用 tsconfig.json

通常我们可以使用 tsc 命令来编译少量 TypeScript 文件:


/*

 参数介绍:

 --outFile // 编译后生成的文件名称

 --target  // 指定ECMAScript目标版本

 --module  // 指定生成哪个模块系统代码

 index.ts  // 源文件

*/

$ tsc --outFile leo.js --target es3 --module amd index.ts

但如果实际开发的项目,很少是只有单个文件,当我们需要编译整个项目时,就可以使用 tsconfig.json 文件,将需要使用到的配置都写进 tsconfig.json 文件,这样就不用每次编译都手动输入配置,另外也方便团队协作开发。



二、使用 tsconfig.json

目前使用 tsconfig.json 有2种操作:


1. 初始化 tsconfig.json

在初始化操作,也有 2 种方式:


手动在项目根目录(或其他)创建 tsconfig.json 文件并填写配置;

通过 tsc --init 初始化 tsconfig.json 文件。


2. 指定需要编译的目录

在不指定输入文件的情况下执行 tsc 命令,默认从当前目录开始编译,编译所有 .ts 文件,并且从当前目录开始查找 tsconfig.json 文件,并逐级向上级目录搜索。


$ tsc

另外也可以为 tsc 命令指定参数 --project 或 -p 指定需要编译的目录,该目录需要包含一个 tsconfig.json 文件,如:


/*

 文件目录:

 ├─src/

 │  ├─index.ts

 │  └─tsconfig.json

 ├─package.json

*/

$ tsc --project src

注意,tsc 的命令行选项具有优先级,会覆盖 tsconfig.json 中的同名选项。



更多 tsc 编译选项,可查看《编译选项》章节。



三、使用示例

这个章节,我们将通过本地一个小项目 learnTsconfig 来学着实现一个简单配置。

当前开发环境:windows / node 10.15.1 / TypeScript3.9



1. 初始化 learnTsconfig 项目

执行下面命令:


$ mkdir learnTsconfig

$ cd .\learnTsconfig\

$ mkdir src

$ new-item index.ts

并且我们为 index.ts 文件写一些简单代码:


// 返回当前版本号

function getVersion(version:string = "1.0.0"): string{

   return version;

}


console.log(getVersion("1.0.1"))

我们将获得这么一个目录结构:


 └─src/

    └─index.ts


2. 初始化 tsconfig.json 文件

在 learnTsconfig 根目录执行:


$ tsc --init


3. 修改 tsconfig.json 文件

我们设置几个常见配置项:


{

 "compilerOptions": {

   "target": "ES5",             // 目标语言的版本

   "module": "commonjs",        // 指定生成代码的模板标准

   "noImplicitAny": true,       // 不允许隐式的 any 类型

   "removeComments": true,      // 删除注释

   "preserveConstEnums": true,  // 保留 const 和 enum 声明

   "sourceMap": true            // 生成目标文件的sourceMap文件

 },

 "files": [   // 指定待编译文件

   "./src/index.ts"  

 ]

}

其中需要注意一点:

files 配置项值是一个数组,用来指定了待编译文件,即入口文件。

当入口文件依赖其他文件时,不需要将被依赖文件也指定到 files 中,因为编译器会自动将所有的依赖文件归纳为编译对象,即 index.ts 依赖 user.ts 时,不需要在 files 中指定 user.ts , user.ts 会自动纳入待编译文件。



4. 执行编译

配置完成后,我们可以在命令行执行 tsc 命令,执行编译完成后,我们可以得到一个 index.js 文件和一个 index.js.map 文件,证明我们编译成功,其中 index.js 文件内容如下:


function getVersion(version) {

   if (version === void 0) { version = "1.0.0"; }

   return version;

}

console.log(getVersion("1.0.1"));

//# sourceMappingURL=index.js.map

可以看出,tsconfig.json 中的 removeComments 配置生效了,将我们添加的注释代码移除了。



到这一步,就完成了这个简单的示例,接下来会基于这个示例代码,讲解《七、常见配置示例》。



四、tsconfig.json 文件结构介绍


1. 按顶层属性分类

在 tsconfig.json 文件中按照顶层属性,分为以下几类:

tsconfig.json 文件结构(顶层属性).png


了不起的 tsconfig.json 指南.png



2. 按功能分类

tsconfig.json 文件结构(功能).png




五、tsconfig.json 配置介绍


1. compileOnSave

compileOnSave 属性作用是设置保存文件的时候自动编译,但需要编译器支持。


{

   // ...

 "compileOnSave": false,

}


2. compilerOptions

compilerOptions 属性作用是配置编译选项。

若 compilerOptions 属性被忽略,则编译器会使用默认值,可以查看《官方完整的编译选项列表》。

编译选项配置非常繁杂,有很多配置,这里只列出常用的配置。


{

 // ...

 "compilerOptions": {

   "incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度

   "tsBuildInfoFile": "./buildFile", // 增量编译文件的存储位置

   "diagnostics": true, // 打印诊断信息

   "target": "ES5", // 目标语言的版本

   "module": "CommonJS", // 生成代码的模板标准

   "outFile": "./app.js", // 将多个相互依赖的文件生成一个文件,可以用在AMD模块中,即开启时应设置"module": "AMD",

   "lib": ["DOM", "ES2015", "ScriptHost", "ES2019.Array"], // TS需要引用的库,即声明文件,es5 默认引用dom、es5、scripthost,如需要使用es的高级版本特性,通常都需要配置,如es8的数组新特性需要引入"ES2019.Array",

   "allowJS": true, // 允许编译器编译JS,JSX文件

   "checkJs": true, // 允许在JS文件中报错,通常与allowJS一起使用

   "outDir": "./dist", // 指定输出目录

   "rootDir": "./", // 指定输出文件目录(用于输出),用于控制输出目录结构

   "declaration": true, // 生成声明文件,开启后会自动生成声明文件

   "declarationDir": "./file", // 指定生成声明文件存放目录

   "emitDeclarationOnly": true, // 只生成声明文件,而不会生成js文件

   "sourceMap": true, // 生成目标文件的sourceMap文件

   "inlineSourceMap": true, // 生成目标文件的inline SourceMap,inline SourceMap会包含在生成的js文件中

   "declarationMap": true, // 为声明文件生成sourceMap

   "typeRoots": [], // 声明文件目录,默认时node_modules/@types

   "types": [], // 加载的声明文件包

   "removeComments":true, // 删除注释

   "noEmit": true, // 不输出文件,即编译后不会生成任何js文件

   "noEmitOnError": true, // 发送错误时不输出任何文件

   "noEmitHelpers": true, // 不生成helper函数,减小体积,需要额外安装,常配合importHelpers一起使用

   "importHelpers": true, // 通过tslib引入helper函数,文件必须是模块

   "downlevelIteration": true, // 降级遍历器实现,如果目标源是es3/5,那么遍历器会有降级的实现

   "strict": true, // 开启所有严格的类型检查

   "alwaysStrict": true, // 在代码中注入'use strict'

   "noImplicitAny": true, // 不允许隐式的any类型

   "strictNullChecks": true, // 不允许把null、undefined赋值给其他类型的变量

   "strictFunctionTypes": true, // 不允许函数参数双向协变

   "strictPropertyInitialization": true, // 类的实例属性必须初始化

   "strictBindCallApply": true, // 严格的bind/call/apply检查

   "noImplicitThis": true, // 不允许this有隐式的any类型

   "noUnusedLocals": true, // 检查只声明、未使用的局部变量(只提示不报错)

   "noUnusedParameters": true, // 检查未使用的函数参数(只提示不报错)

   "noFallthroughCasesInSwitch": true, // 防止switch语句贯穿(即如果没有break语句后面不会执行)

   "noImplicitReturns": true, //每个分支都会有返回值

   "esModuleInterop": true, // 允许export=导出,由import from 导入

   "allowUmdGlobalAccess": true, // 允许在模块中全局变量的方式访问umd模块

   "moduleResolution": "node", // 模块解析策略,ts默认用node的解析策略,即相对的方式导入

   "baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录

   "paths": { // 路径映射,相对于baseUrl

     // 如使用jq时不想使用默认版本,而需要手动指定版本,可进行如下配置

     "jquery": ["node_modules/jquery/dist/jquery.min.js"]

   },

   "rootDirs": ["src","out"], // 将多个目录放在一个虚拟目录下,用于运行时,即编译后引入文件的位置可能发生变化,这也设置可以虚拟src和out在同一个目录下,不用再去改变路径也不会报错

   "listEmittedFiles": true, // 打印输出文件

   "listFiles": true// 打印编译的文件(包括引用的声明文件)

 }

}


3. exclude

exclude 属性作用是指定编译器需要排除的文件或文件夹。

默认排除 node_modules 文件夹下文件。


{

   // ...

 "exclude": [

   "src/lib" // 排除src目录下的lib文件夹下的文件不会编译

 ]

}

和 include 属性一样,支持 glob 通配符:


* 匹配0或多个字符(不包括目录分隔符)

? 匹配一个任意字符(不包括目录分隔符)

**/ 递归匹配任意子目录


4. extends

extends 属性作用是引入其他配置文件,继承配置。

默认包含当前目录和子目录下所有 TypeScript 文件。


{

   // ...

 // 把基础配置抽离成tsconfig.base.json文件,然后引入

   "extends": "./tsconfig.base.json"

}


5. files

files 属性作用是指定需要编译的单个文件列表。

默认包含当前目录和子目录下所有 TypeScript 文件。


{

   // ...

 "files": [

   // 指定编译文件是src目录下的leo.ts文件

   "scr/leo.ts"

 ]

}


6. include

include 属性作用是指定编译需要编译的文件或目录。


{

   // ...

 "include": [

   // "scr" // 会编译src目录下的所有文件,包括子目录

   // "scr/*" // 只会编译scr一级目录下的文件

   "scr/*/*" // 只会编译scr二级目录下的文件

 ]

}


7. references

references 属性作用是指定工程引用依赖。

在项目开发中,有时候我们为了方便将前端项目和后端node项目放在同一个目录下开发,两个项目依赖同一个配置文件和通用文件,但我们希望前后端项目进行灵活的分别打包,那么我们可以进行如下配置:


{

   // ...

 "references": [ // 指定依赖的工程

    {"path": "./common"}

 ]

}


8. typeAcquisition

typeAcquisition 属性作用是设置自动引入库类型定义文件(.d.ts)相关。

包含 3 个子属性:


enable  : 布尔类型,是否开启自动引入库类型定义文件(.d.ts),默认为 false;

include  : 数组类型,允许自动引入的库名,如:["jquery", "lodash"];

exculde  : 数组类型,排除的库名。

{

   // ...

 "typeAcquisition": {

   "enable": false,

   "exclude": ["jquery"],

   "include": ["jest"]

 }

}


六、常见配置示例

本部分内容中,我们找了几个实际开发中比较常见的配置,当然,还有很多配置需要自己摸索哟~~



1. 移除代码中注释

tsconfig.json:


{

 "compilerOptions": {

   "removeComments": true,

 }

}

编译前:


// 返回当前版本号

function getVersion(version:string = "1.0.0"): string{

   return version;

}

console.log(getVersion("1.0.1"))

编译结果:


function getVersion(version) {

   if (version === void 0) { version = "1.0.0"; }

   return version;

}

console.log(getVersion("1.0.1"));


2. 开启null、undefined检测

tsconfig.json:


{

   "compilerOptions": {

       "strictNullChecks": true

   },

}

修改 index.ts 文件内容:


const leo;

leo = new Pingan('leo','hello');


这时候编辑器也会提示错误信息,执行 tsc 后,控制台报错:


src/index.ts:9:11 - error TS2304: Cannot find name 'Pingan'.


9 leo = new Pingan('leo','hello');


Found 1 error.


3. 配置复用

通过 extends 属性实现配置复用,即一个配置文件可以继承另一个文件的配置属性。

比如,建立一个基础的配置文件 configs/base.json :


{

 "compilerOptions": {

   "noImplicitAny": true,

   "strictNullChecks": true

 }

}

在tsconfig.json 就可以引用这个文件的配置了:


{

 "extends": "./configs/base",

 "files": [

   "main.ts",

   "supplemental.ts"

 ]

}


4. 生成枚举的映射代码

在默认情况下,使用 const 修饰符后,枚举不会生成映射代码。

如下,我们可以看出:使用 const 修饰符后,编译器不会生成任何 RequestMethod 枚举的任何映射代码,在其他地方使用时,内联每个成员的值,节省很大开销。


const enum RequestMethod {

 Get,

 Post,

 Put,

 Delete

}


let methods = [

 RequestMethod.Get,

 RequestMethod.Post

]

编译结果:


"use strict";

let methods = [

   0 /* Get */,

   1 /* Post */

];

当然,我们希望生成映射代码时,也可以设置 tsconfig.json 中的配置,设置 preserveConstEnums 编译器选项为 true :


{

 "compilerOptions": {

   "target": "es5",

   "preserveConstEnums": true

 }

}


最后编译结果变成:


"use strict";

var RequestMethod;

(function (RequestMethod) {

   RequestMethod[RequestMethod["Get"] = 0] = "Get";

   RequestMethod[RequestMethod["Post"] = 1] = "Post";

   RequestMethod[RequestMethod["Put"] = 2] = "Put";

   RequestMethod[RequestMethod["Delete"] = 3] = "Delete";

})(RequestMethod || (RequestMethod = {}));

let methods = [

   0 /* Get */,

   1 /* Post */

];


5. 关闭 this 类型注解提示

通过下面代码编译后会报错:


const button = document.querySelector("button");

button?.addEventListener("click", handleClick);

function handleClick(this) {

console.log("Clicked!");

this.removeEventListener("click", handleClick);

}


报错内容:


src/index.ts:10:22 - error TS7006: Parameter 'this' implicitly has an 'any' type.

10 function handleClick(this) {

Found 1 error.


这是因为 this 隐式具有 any 类型,如果没有指定类型注解,编译器会提示“"this" 隐式具有类型 "any",因为它没有类型注释。”。



解决方法有2种:


指定 this 类型,如本代码中为 HTMLElement 类型:

HTMLElement 接口表示所有的 HTML 元素。一些HTML元素直接实现了 HTMLElement 接口,其它的间接实现HTMLElement接口。

关于 HTMLElement 可查看详细。


使用 --noImplicitThis 配置项:


在 TS2.0 还增加一个新的编译选项: --noImplicitThis,表示当 this 表达式值为 any 类型时生成一个错误信息。我们设置为 true 后就能正常编译。


{

 "compilerOptions": {

   "noImplicitThis": true

 }

}


七、Webpack/React 中使用示例


1. 配置编译 ES6 代码,JSX 文件

创建测试项目 webpack-demo,结构如下:


webpack-demo/

 |- package.json

 |- tsconfig.json

 |- webpack.config.js

 |- /dist

   |- bundle.js

   |- index.html

 |- /src

   |- index.js

   |- index.ts

 |- /node_modules

安装 TypeScript 和 ts-loader:


$ npm install --save-dev typescript ts-loader

配置 tsconfig.json,支持 JSX,并将 TypeScript 编译为 ES5:


{

 "compilerOptions": {

   "outDir": "./dist/",

   "noImplicitAny": true,

+   "module": "es6",

+   "target": "es5",

+   "jsx": "react",

   "allowJs": true

 }

}

还需要配置 webpack.config.js,使其能够处理 TypeScript 代码,这里主要在 rules 中添加 ts-loader :


const path = require('path');


module.exports = {

 entry: './src/index.ts',

 module: {

   rules: [

     {

       test: /\.tsx?$/,

       use: 'ts-loader',

       exclude: /node_modules/

     }

   ]

 },

 resolve: {

   extensions: [ '.tsx', '.ts', '.js' ]

 },

 output: {

   filename: 'bundle.js',

   path: path.resolve(__dirname, 'dist')

 }

};


2. 配置 source map

想要启用 source map,我们必须配置 TypeScript,以将内联的 source map 输出到编译后的 JavaScript 文件中。

只需要在 tsconfig.json 中配置 sourceMap 属性:


 {

   "compilerOptions": {

     "outDir": "./dist/",

+     "sourceMap": true,

     "noImplicitAny": true,

     "module": "commonjs",

     "target": "es5",

     "jsx": "react",

     "allowJs": true

   }

 }

然后配置 webpack.config.js 文件,让 webpack 提取 source map,并内联到最终的 bundle 中:


 const path = require('path');


 module.exports = {

   entry: './src/index.ts',

+   devtool: 'inline-source-map',

   module: {

     rules: [

       {

         test: /\.tsx?$/,

         use: 'ts-loader',

         exclude: /node_modules/

       }

     ]

   },

   resolve: {

     extensions: [ '.tsx', '.ts', '.js' ]

   },

   output: {

     filename: 'bundle.js',

     path: path.resolve(__dirname, 'dist')

   }

 };


八、总结

本文较全面介绍了 tsconfig.json 文件的知识,从“什么是 tsconfig.js 文件”开始,一步步带领大家全面认识 tsconfig.json 文件。

文中通过一个简单 learnTsconfig 项目,让大家知道项目中如何使用 tsconfig.json 文件。在后续文章中,我们将这么多的配置项进行分类学习。最后通过几个常见配置示例,解决我们开发中遇到的几个常见问题。

vue.js路由与vuex数据模型设计

seo达人

路由设计

本则路由考虑验证进入登录页面,完成登录操作进入首页。


import Vue from "vue";

import Router from "vue-router";

Vue.use(Router);


import store from "@/store/store";


// (延迟加载)

const Login = () => import("@/views/login");

const Home = () => import("@/views/home");


const HomeRoute = {

 path: "/",

 name: "首页",

 component: Home

};


export { HomeRoute };


const router = new Router({

 base: process.env.BASE_URL,

 routes: [

   {

     path: "/login",

     name: "登录",

     component: Login

   },

   HomeRoute

 ]

});


router.beforeEach((to, from, next) => {

 let loginName = store.state.user.loginName;

 if (to.path === "/" && loginName == "") {

   next("/login");

 } else {

   next();

 }

});


export default router;

数据模型

const state = {

 loginName: ""

};

const mutations = {

 SET_LOGINNAME(state, loginName) {

   state.loginName = loginName;

 }

};

const actions = {

 login({ commit }, userInfo) {

   return new Promise((res, ret) => {

     commit("SET_LOGINNAME", userInfo);

     res();

   });

 },

 logout({ commit }) {

   return new Promise((res, ret) => {

     commit("SET_LOGINNAME", "");

     res();

   });

 }

};

export default {

 namespaced: true,

 state,

 mutations,

 actions

};

import Vue from "vue";

import Vuex from "vuex";

Vue.use(Vuex);


import user from "./modules/user";


const store = new Vuex.Store({

 modules: {

   user

 }

});


export default store;

组件

<div class="modify">

 <input

   type="text"

   @keydown.enter.prevent="handleKeydown"

   v-model="currentVal"

   placeholder="使用enter键切换频道"

 />

 <button @click="reset" style="margin-left:5px;outline:none;cursor:pointer;">复位</button>

</div>

import { mapState, mapMutations, mapActions } from "vuex";

export default {

 name: "login",

 data() {

   return {

     currentVal: "",

     list: ["咨询服务", "音悦台", "体育台", "财经频道", "时尚资讯"],

     index: 0

   };

 },

 computed: {

   ...mapState({

     loginName: state => state.user.loginName

   })

 },

 methods: {

   ...mapActions({

     login: "user/login"

   }),

   handleToHome() {

     let userInfo = "user";

     this.login(userInfo);

     this.$router.push({

       path: "/"

     });

   },

RN和React路由详解及对比

seo达人

前言

在平时H5或者RN开发时,我们业务场景中大部分都不是单页面的需求,那这时我们就能使用路由在进行多页面的切换。下面会对比一下react路由和RN路由的本质区别和使用方法。


路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程

React路由

简介

使用React构建的单页面应用,要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明


在根组件上配置路由,引用react-router-dom结构{ HashRouter as Router, Route ,Link ,Redirect ,Switch },HashRouter组件是路由的根组件,定义属性和方法传递给子组件。Router组件进行路由,指定每个路由跳转到相应的组件。Link组件指定跳转链接。Redirect组件路由重定向,不管什么情况下,都会跳转当前指定的路径,和switch组件联合起来一起调用,当路径匹配到路由,不在往下匹配


两类路由

HashRouter:利用监听hash变化(有一个事件hashchange)实现路由切换,它是路由容器,

渲染子组件,并向下层子组件传递(Context上下文传递)loaction,history等路由信息


BrowserHistory:利用H5Api实现路由切换,是路由容器,渲染子组件,

并向子组件传递loaction,history等路由信息

路由配置

image-20200601110809995


路由实现原理

HashRouter只是一个容器,本身并没有DOM结构

它渲染的就是它的子组件,并向下层传递location

组件挂载完成之后根据hash改变pathname的值,如果没有hash值就默认展示根组件

需要跳转路由页面时我们使用link或者push去赋值hash的pathname 如this.props.history.push({ pathname: preview, param: { pic, index } });

当hash值发生变化的时候会通过hashchange捕获变化,并给pathname重新赋值

拿到上下文中传过来的location,然后取出pathname。再对它的子组件进行遍历,如果子组件的path属性和当前上下文中传过来的pathname属性相匹配就进行渲染,若不匹配就返回null。

总结

React路由是实质就是,根据遍历识别路由的pathname,来切换router路由容器中component组件的加载渲染。每次更改pathname就都是组件的重新渲染流程,页面也都会呈现出刷新的效果。


RN路由

简介

RN把导航和路由都集中到了react-navigation库里面

组件使用堆栈式的页面导航来实现各个页面跳转

构造函数:StackNavigator(RouteConfigs, StackNavigatorConfig)

RouteConfigs:页面路由配置

StackNavigatorConfig:路由参数配置

路由配置

image-20200601111333107


参数详解

navigationOptions:配置StackNavigator的一些属性。


   title:标题,如果设置了这个导航栏和标签栏的title就会变成一样的,不推荐使用

   header:可以设置一些导航的属性,如果隐藏顶部导航栏只要将这个属性设置为null

   headerTitle:设置导航栏标题,推荐

   headerBackTitle:设置跳转页面左侧返回箭头后面的文字,默认是上一个页面的标题。可以自定义,也可以设置为null

   headerTruncatedBackTitle:设置当上个页面标题不符合返回箭头后的文字时,默认改成"返回"

   headerRight:设置导航条右侧。可以是按钮或者其他视图控件

   headerLeft:设置导航条左侧。可以是按钮或者其他视图控件

   headerStyle:设置导航条的样式。背景色,宽高等

   headerTitleStyle:设置导航栏文字样式

   headerBackTitleStyle:设置导航栏‘返回’文字样式

   headerTintColor:设置导航栏颜色

   headerPressColorAndroid:安卓独有的设置颜色纹理,需要安卓版本大于5.0

   gesturesEnabled:是否支持滑动返回手势,iOS默认支持,安卓默认关闭



screen:对应界面名称,需要填入import之后的页面


mode:定义跳转风格


  card:使用iOS和安卓默认的风格


  modal:iOS独有的使屏幕从底部画出。类似iOS的present效果


headerMode:返回上级页面时动画效果


  float:iOS默认的效果


  screen:滑动过程中,整个页面都会返回


  none:无动画


cardStyle:自定义设置跳转效果


  transitionConfig: 自定义设置滑动返回的配置


  onTransitionStart:当转换动画即将开始时被调用的功能


  onTransitionEnd:当转换动画完成,将被调用的功能


path:路由中设置的路径的覆盖映射配置


initialRouteName:设置默认的页面组件,必须是上面已注册的页面组件


initialRouteParams:初始路由参数

路由首页

react:


image-20200601111638902


在react中初始化时没有指定hash值,route会匹配路由表里面的根组件”/”


RN:


image-20200601111722749


RN 需要在StackNavigatorConfig里面指定首页


RN路由使用

image-20200601112012191


在入口路由列表注册完成之后 在导航器中的每一个页面,都有 navigation 属性 通过提供的navigate方法来提供跳转


navigation

在导航器中每一个页面都有navigation属性,该属性有以下几个属性/方法

navigate 跳转到其他页面 常用参数如下

routeName 导航器中配置的路由名称

params 传递到下一个页面的参数

state:state 里面包含有传递过来的参数 params 、 key 、路由名称 routeName

setParams 更改当前页面路由参数(后面详细介绍)

goBack: 回退可穿参数

navigate



setParams




循环设计,用户体验如何呼唤时代变革

ui设计分享达人

关于循环设计,可持续发展是商业领域非常关注的话题,作为UX需提前转变思维,给企业带来更多价值,一线大厂已在运用这种思维



本文共 3589 字,预计阅读 10 分钟

译者推荐|本文从“可持续”和“设计”的两点谈起,来论述从线性经济向可持续经济的转变,以及“可持续设计”的四个主要阶段:理解、定义、制造、发布。

“循环设计”不是为了追求时髦或者抬升设计地位,而是将这个已经日益庸俗化的“设计”冠为自己的定语,是设计本身发展所趋,以及可持续发展所需,设计界需要对自己的责任有所承担,形成一个全局观、系统性看待设计问题的方式。让回收利用和可持续发展成为一种规范,从而做到一劳永逸。

我们生活在一个呼唤变革的世界。在过去的50年中,现代社会所依赖的漫不经心和无休止的消费是不可持续的。我们从小就不关心自己的事情。如果有什么东西坏了,我们也就不修了。产品被设计成用完直接丢弃,而不是去修复。数字产品也不例外。然而,为了解决这些问题,出现了一种新的思维方式:循环设计(可持续设计)①。(益达说:其实这个理念和风格已经存在了很长的时间,大多应用在不为大众所知的能源、材料再生流程之中,然而随着时代的发展,循环设计可以变得更加普世。)

①注:循环设计是20世纪80-90年代产生的一种设计风格,他又称回收设计,是指实现广义收回和利用的方法,即在进行产品设计时,充分考虑产品零部件及材料回收的可能性,回收价值的大致方法,回收处理结构工艺性等于与回收有关的一系列问题,以达到零部件及材料资源和能源的再利用。它旨在通过设计来节约能源和材料,减少对环境的污染,使人类的设计物能多次反复利用,形成产品设计和使用的良性循环。

那么,循环设计方法意味着什么?在数字产品上要如何使用?在回答这些问题之前,首先,我们需要仔细观察我们是如何构建我们的世界,为什么这个世界已经不可持续了,并且要理解环保世界的需求是如何改变我们的思维方式,促使我们渴望从线性设计模型转变为循环设计模型。


向循环转变


我们的经济主要基于“按需配置”流程之上。在此线性系统中,我们构建了会在一段时间后淘汰的产品,并且将其组件视为垃圾。与此相反,循环设计方法将产品的生命周期视为一个闭环,其中资源不断地被重新利用。


在“经典”线性模型中,产品经历了生产、消费和破坏的各个阶段,最终以浪费告终。在设计一款循环产品过程中,我们使用的方法包含四大阶段,这四个阶段形成了一个闭环,并形成了一个恒定的循环,在这个循环中,不仅仅只有闪闪发亮的、新的,未使用过的材料才被受欢迎。

 

循环设计方法的四个阶段是:

理解 / 定义 / 制造 / 发布



当我们同时看线性设计和循环设计模型方法时,有一点吸引人的是,开始设计东西的时候,方法的差异。从只是生产某种东西,到对我们将要生产的产品做出深思熟虑的决定,以及在实施过程中付出的努力和关心,这是一个大转变。


看看我们现在的立场


为什么做出这种转变如此的重要?我确信每个看新闻的人都听说过气候变化。NASA 致力于解决环境问题,因此我们都可以非常详细地了解人类行为和无限增长对我们生态系统的影响。


但好消息是我们不必继续这样做,因为我们可以很容易从数字世界中“产生”方式中学习事物的产生。电力废弃物已成为现代世界的主要废弃物来源之一。大量的手机和电脑被扔掉,随之经济是建立在每年都有新东西的基础上的。


当您的手机屏幕意外碎裂时,我们该怎么办?我们知道如何处理它吗?我们知道如何修理吗?我们并不知道……但是幸运的是,有些设计师对此问题提出了解决方案。Fairphone② 是一种合乎情理,模块化的智能手机,其组件数量很少,可以轻松更换和回收。大公司也应朝这个方向迈出一步,让回收利用和可持续发展成为一种时尚和规范,一劳永逸。

② Fairphone:这家公司生产的手机希望实现全球手机供应链的公平贸易,具体而言就是不使用“冲突矿物”并且确保生产手机的工人没有被奴役和压榨,目前仍然坚持在非洲贫困和战乱的国家进口材料,已经在刚果和卢旺达境内找到了一些矿山,用更好的商业实践推动当地经济更健康地发展。


设计和设计师的重要性


设计师,比任何其他专业人士,都更有可能在一转变中产生巨大的影响的人。我还敢说,我们有责任采用可持续设计的方式行动和思考。因为是我们创造了那些最终出现在传送带上的东西。我们也有责任教育我们的用户。幸运的是,越来越多的人重视具有可持续发展目标的产品或品牌,或者重视起在产品背后有意义的故事。同样,可持续发展不仅成为流行语,而且成为一种价值观,被越来越多的人意识到基于有限资源的无限增长是无法实现的目标。但是,要从线性经济向可持续经济转变,我们需要学习不同的思维方式。幸运的是,智能设备和数字产品的时代带来了一种复杂的设计思维方法,可以作为物理世界中生产链的范例。


用户体验必须提供什么


地球上有一个地方,您不能随便丢东西:互联网。这是一个对已有产品进行再构思的地方,您只能去完善它,不能丢弃它,因为如果您一夜之间说:“我不喜欢我的网站,明天我将推出一个全新的网站”,那您便会失去用户。

如果我们看一下可持续发展设计方法的四个主要阶段,就会发现我们在用户体验设计中使用的方法与此很相似。

让我们再次看一下四个阶段,然后将其更详细地分解:

理解

当我们谈论与循环设计相关的理解时,我们谈论的是在开始设计一个未来的产品之前就了解它的用户和环境。研究一直是数字产品设计的基础。与数字产品的连接比与实体产品的连接要更多的涉及到人类的心理。因此不可避免地要开发出新的研究方法,以帮助我们洞察用户在使用某种产品时的想法、感受和行为。但这不仅与用户有关, 研究还必须深入到经济领域,并研究未来产品的组成部分,同时牢记它们必须可被再次利用。


定义

在此阶段,将定义(商业)目标,并构建一个商业模型画布作为生产过程的计划。用户体验使用这种方法已有一段时间了,让涉众参与其中,并在设计过程中更多地激活它们。为我们设计的产品设定一个目标是至关重要的,因为有了它,我们可以为用户创造额外的价值。因此,无论是制作商业模型画布还是举办精彩的价值主张研讨会,在生产方式中实施这些方法都会对当前的生产流程产生巨大的影响。


制造

这是关键部分。现在我们正在做的事情就好像没有明天一样。随着每种无法回收的产品的出现,我们产生的废料越来越多。但是循环方法是为产品创建一个原型,并定义将需要使用那些材料反映在产品原型上,并在定义阶段概述的商业模型上定义材料。原型设计和构思是用户体验设计过程中的关键要素,这也是为什么需要制作原型。


发布 

根据循环设计模型,随着产品的发布,生产周期进入了第四阶段,然同时理解阶段又重新开始了。对于数字产品来说,这是自然发生的事前:你发布一个产品,基于该版本收集反馈,然后构思它,周而复始,这个循环再次产生。


但是,观察这个循环并建立这些连接仅仅是冰山一角。在数字时代发展起来的设计思维给世界带来了许多反思。


变革中的大佬


幸运的是,已经有许多大品牌意识到转变的必要性,并采取和提出了数字设计思维方法来支持转变,并建立循环设计的时代。根据《循环设计指南》,“我们应该把我们设计的所有东西都看作软件产品和服务——这些产品和服务可以基于我们通过反馈得到的数据而不断的发。”


用户体验研究和用户体验设计一直是在做的一件事是:基于全面的研究和真实的用户需求来构建产品。上面的设计指南是非常复杂的工具,具有许多可能的方法。它强调了从产品到服务流程转变的重要性,并展示如何使用敏捷流程并将其实施到构建产品的方法之中。


IDEO(全球顶尖的设计咨询公司)与 Ellen Macarthur Foundation(艾伦·麦克阿瑟基金会)合作,试图“试图通过设计构建一个具有恢复性和再生性的经济框架”。在这里,您可以找到几乎每个生产方面和领域——例如食品、时装、经济和设计——并在每个领域中提出解决方案,以打破线性生产系统。


耐克还宣布了其基于循环设计模型生产高品质运动鞋的新方法原则。正如您已经看到的那样,无论您身处哪个经济领域,都可以为循环生产过程的蓬勃发展做贡献,并成为一支主导力量。


重要的结论


我认为,作为设计师,我们始终要为变革而努力,并始终努力与客户、产品或服务保持紧密的关系,并通过构思使其不断完善,以实现这一目标。这是因为伟大的事情只有通过时间和不断的反思才能实现。在离线世界中,数字设计过程也有很多东西可以贡献。希望通过教育,能有更多的大公司意识到用户真正想要的产品是具有更多功能并可持续使用的,而不仅仅是将它们当作一次性产品,一旦它们不像最初那样光鲜就把她扔掉。

转自:站酷-大猴儿er



用户初次打开软件,如何给TA 留下好印象?(组件篇)

资深UI设计者


(Onboarding 是指用户第一次使用产品时认识、熟悉产品的过程)

往期回顾:

对设计系统有所认识的话应该会知道原子设计(Atomic Design)的重要性,我们也能将同样的概念应用在 onboarding 上,其构成从宏观到微观分成体验流程、控件形式与界面元素三个层级。

体验流程是一个有时序性的旅程,可以由数个不同的载具表现组合而成;控件则是承载信息而存在的平面,可以放上不同的元素;而界面元素是无法再行分割的对象。

我在每个阶段都举了几个常见的例子,搭配市面上产品的应用方法。

体验流程

1. 分流 Branching

一个产品通常不会只有一种用户——使用健身 app 可能是为了减肥,也可能是为了增重;使用协作产品可能是为了记录工作成果,也可能是为了管理团队。如果能够在 onboarding 阶段了解用户的主要意图、在适量的搜集信息后将用户分流(记得上篇的避免过度吸收法则吗?),就能够打造更切身的体验。

除了用户分流之外,还有一些概括性的分流如下:

真正新的使用者 vs. 回流使用者

某些使用者只是因为一些外部因素(手机掉了、手滑删掉 app、忘记密码)而重新登录/下载产品,他们已经接触过产品的核心价值了,并不需要再次学习,这就是为什么跳过(skip)功能很重要。

邀请人 vs. 受邀人

如果邀请人已经设定好群组,受邀人应该自动被加入,某些信息也该自动填入,而非让用户再填一次,从而导致出错。

新手 vs. 老手

与专业领域高度相关的产品(例如 Adobe 系列、CAD 系列等)还可以将用户区分为已经很熟悉作业流程的老手与初学者等级的新手。老手最重视的是定制化以符合他们习惯的作业流程、作业效率高不高,并且跟其他竞品做比较。新手则不然,初次使用产品时的他们也是初次进入这个领域,如果能帮助他们更加了解这个领域的大致流程的话会很加分。

△ Photoshop 的丰富资源指引(Rich Tooltips)对于新手来说是一大神助

2. 展示 Showcase

特别点出几个重点 features,简单地告知用户最重要的功能为何、组件在哪里,用户在登录产品之后只要知道这几个主要动作就可以打遍天下无敌手。

△ Slack 指出 channel 和对话框如何使用

当产品较为复杂,难以指出特定 feature 时,也常以影片或图片来展现产品价值——也就是画一张大饼给用户,让他们想象未来的生活在用了这个产品后会有多便利,或是让自我感觉提升。

3. 实际演练 Do to Learn

相对于展示,实际演练更着重用户要亲自执行。许多研究都证实从做中学习的成效,就算只是训练肌肉记忆(muscle memory),也能让用户对界面的物理空间更有概念,像是「噢对刚才有做过,我记得按键在右上角」。

我们也可以设计一套 demo 版的试用,像是将 scenario 抓一个出来让用户试跑,跑过一个假想的故事情节后印象会更为深刻。

4. 演化成资源库 Resource

在初次展示后将用户引导的数据回收再利用,变成每当用户有问题时都随时可用的资源库。

载具形式

1. 导览 Guided Tour

可能是影片,也可能是滑动式 slideshow,但总之是向用户介绍产品的主要功能或是传达产品价值,通常是为了展示的体验流程所设置。

2. 指引 Tooltip / Coachmark

用极小的空间指向目标物,既可以集中用户注意力,又不会遮盖住大部分的使用空间,用户可以一边进行正规作业,一边通过指引了解不懂的内容。

△ Dropbox Paper 用诙谐的语气鼓励你开始打字

有一阵子很多产品会将所有指引放在同一张图上,但其实使用不当很容易造成信息过载、注意力分散、之后会很难全数记住的情况,我的建议是一次一个比较好。

3. 秀给我看 Show Me

通常只会出现在教程中,强迫用户一定要亲自去按到按键或执行关键动作,切实练习用户的肌肉记忆。

界面元素

1. 空白状态的行动呼吁 Empty State CTA

擅用空白状态是 onboarding 重要的一环,毕竟许多产品在用户动作之前可能都没有太多料,这时候就要运用行动呼吁。

例如 Tumblr 在指导使用者选择有兴趣的领域之后就指出如何 po 内容,因为其用户生成平台(UGC,User-generated content)的本质就是要鼓励用户多交流、多产出,平台才有价值。

2. 进度列 Progress Bar

提供进度可视化,让用户有掌控时间的感觉,而不是不知道自己还要再走几个步骤而感到不耐烦。

Basecamp 将进度列摆在上端,让使用者知道已经快做完这些设置了

3. 待办事项 Checklist

人类天生喜欢将事情「全部做完」,欲罢不能:科技如何让我们上瘾?可以协助我们「引诱」用户更愿意完成 onboarding 程序。

Bluma Zeigarnik 让受试者完成某些任务,但在他们完成另一些任务前打断他们,强迫他们开始进行其他的任务。这些受试者会非常不情愿地停下手上正在做的事,有些人会强烈抗议,有些人甚至会生气,这显示出 Zeigarnik 的打断为他们带来多么大的压力。到实验的最后,受试者清楚记得那些未完成的任务。如果是打断后一阵子又让他们完成的话,就没有这种效应。(摘自 欲罢不能)

4. 跳过 Skip

每次有 onboarding 都会选择跳过的人举手!

我喜欢把这称为不喜欢看桌游规则的人们,所以在使用中遇到困难时给予提示,对他们来说才是最实用而且最愉悦的,而不是在使用前的纸上谈兵。

△ Tumblr 在使用者第一次发文时才提示如何装饰文字

设计 onboarding 时并不是只能选择一种方法,我们可以灵活运用各种元素。将 onboarding 视为一个旅程,而不是单一元素的无限重复。我看过大部分最棒的例子都是综合使用上述多种元素,以下以新兴生产力工具 Coda 为例,来看看集上述大成的 onboarding 作品。

在第一次进入产品使用引导时,可以自行选择偏好的学习方式——影片或是交互式教学。

Coda 并没有强制用户立刻进入 onboarding 模式,而是在呈现主画面之余,让我们看到右侧的待办事项,令人产生「想将之完成」的欲望。

点入后,先有个 setup 内容,任务情境是为了项目经理所设计,但随着使用教程的进行,用户也能够联想到自己生活中的其他任务,例如安排家庭旅游、写系列文案、追踪买家信息等。

正式进入学习阶段后,进度条就出现了。

单纯根据文字叙述,用户仍然可能混淆,这时候 Show Me 功能可以减少不必要的误解。

同上,当用专有名词(此处的 section )介绍某个界面元素时,将其他无关紧要的区域遮盖住,聚焦在重点区域,用户更容易将专有名词跟界面链接在一起。否则单说 section 谁知道是哪一个 section?

结束时记得给辛苦学习的用户一些奖励,并且贴心附上下一步,当然还是要留给使用者最终决定权。

完成一项后,Coda 会帮用户将完成的项目划除,于是得到立即的回馈。

完成所有步骤之后,原先是教程列的右侧区域转变成资源列,每当使用上遇到困难时就可以寻求各种协助。

题外话与小结

Onboarding 并不是只会出现一次,推出多年的产品也仍会时常进行。

onboarding 的程序,例如推出新 feature 或有重新设计(redesign)的时候,目的仍然是让用户快速熟悉产品,所以这是身为产品设计师不可忽视的一环。

另外,除了 UI/UX 设计之外,文案写作也极其重要——如何跟用户诉说一个吸引人的故事、描绘出他们想象中的自己,也是成功 onboarding 必要元素。

文章来源:优设    作者:

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档