TypeScript从入门到实践专栏是博主在学习和工作过程中的总结,实用性非常强,欢迎订阅哦,学会TS不迷路。
TS系列 | 标题 |
---|---|
基础篇 | TS入门(一) |
基础篇 |
TS类型声明(二) |
基础篇 | TS接口类型(三) |
基础篇 | TS交叉类型&联合类型(四) |
基础篇 | TS类型断言(五) |
基础篇 | TS类型守卫(六) |
进阶篇 | TS函数重载(七) |
进阶篇 | TS泛型(八) |
进阶篇 | TS装饰器(九) |
在前几篇介绍了断言,在使用断言时我们已经确定了变量的类型,确定该类型时一定存在(否则则会欺骗编译,运行时报错),那么为什么还要类型守卫呢?因为类型断言还是需要借助类型守卫的,类型守卫主要是用来判断未知类型是不是所需要的类型。
类型守卫主要包括四种方式:
先写两个接口Teacher、Student,然后将这两个接口进行联合声明,使用in
来判断属性是否在传递的参数中,然后分别作输出。
缺点:用 in 关键字缩小数据类型必须有一个独特的属性作为判别标准,否则不能用 in 关键字
interface Teacher{ name:string; courses:string; } interface Student{ name:string; study:string; } type Class = Teacher | Student; function getInfo(val:Class){ //此时val类型缩小为Teacher类型 if('courses' in val){ console.log(val.courses) } //此时val类型缩小为Student类型 if('study' in val){ console.log(val.study) } } getInfo({ name: 'student', study: "Philosophy" }); //打印结果为Philosophy,因为传参中含有study属性,所以走了第二个判断
![]()
为什么用typeof做类型守卫呢?因为typeof能判断JS基本数据类型。typeof只能识别以下类型:
写法:typeof a
,a是变量(基本数据类型)
奇怪为什么typeof
不能识别null
呢?
let a= null typeof a;//object
null
是一个只有一个值的特殊类型,表示一个空对象引用,可以用来清空对象,它是object
类型是历史遗留下来的问题,曾提议改为null
类型,被拒绝了。
typeof
识别其他的类型比如数组,正则等都是object
类型
let a =[1] typeof a;//Object var reg = RegExp("a","i"); typeof reg//reg
typeof
怎么起到守卫的作用呢,通过typeof判断变量类型然后执行相应的逻辑,具体如下:
function class(name: string, score: string | number) { //识别到sore为number类型 if (typeof score === "number") { return "teacher:" + name + ":" + score; } //识别到sore为string类型 if (typeof score === "string") { return "student:" + name + ":" + score; } }
上面案例的传参都会基本类型,当传一个对象时候,我们也可以用对象中的属性来进行判断,比如:
interface A{ a:string; } interface B{ a:number; } type Class = A | B; function getInfo(val:Class){ //判断val的属性a的类型为number类型 if(typeof val.a === "number"){ console.log('B:'+ val.a) } //判断val的属性a的类型为string类型 if(typeof val.a === "string"){ console.log('A' + val.a) } }
![]()
为什么用instanceof
呢?因为typeof
有局限性,引用类型比如数组,正则等无法精确识别是哪一个种型,instanceof
能够识别变量(比如实例对象)是否属于这个类。instanceof
不能检测原始值类型的值,但是原始值对应的对象格式实例则可以检测。具体instanceof
是怎么做类型守卫的呢?
a instanceof b
,a是参数,b是一般都是接口类型。
interface Teacher{ name:string; courses:string; } interface Student{ name:string; study:string; } type Class = Teacher | Student; function getInfo(val:Class){ //判断val的类型是否是定义的接口Teacher类型 if(val instanceof Teacher){ console.log('teacher:'+ val.courses) } //判断val的类型是否是定义的接口Student类型 if(val instanceof Student){ console.log('student' + val.study) } }
![]()
TS中有一个关键字is
可以判断变量是否属于某种类型。
a is b
,意思是a是b类型,a是函数参数,也可以是this
关键字,this
关键字一般用在累中判断,b可以是接口类型,b也可以是number
、string
等其他合法的TS类型。这种写法称作类型谓词,使用类型谓词的函数称为类型谓词函数,该函数的返回值必须的boolean类型。
isTeacher
,代表了参数cls
是Teacher
类型,然后用这个变量来判断。
函数中的参数类型为多个类型,通过is
关键字自定义类型,将函数参数精确到某种类型,然后再执行相应的逻辑。
interface Teacher{ name:string; courses:string; } interface Student{ name:string; study:string; } const isTeacher = function (cls: Teacher | Student): cls is Teacher { return 'courses' in cls; } const getName = (cls: Teacher | Student) => { if(isTeacher(cls)) { return cls.courses; } }
![]()
下面代码中的 User 是抽象类,不能被实例化,Staff 和 Student 都继承自 User。实例方法 isStaff 用于将类型收窄为 Staff,实例方法 isStudent 用于将类型收窄为 Student
abstract class User { name: string; constructor(name: string) { this.name = name; } isStudent(): this is Student { return this instanceof Student; } isStaff(): this is Staff { return this instanceof Staff; } } class Student extends User{ study: string; constructor(name: string, study: string) { super(name) this.study = study } } class Staff extends User { workingYears: number; constructor(name: string, workingYears: number) { super(name) this.workingYears = workingYears } } function judgeClassType(obj: User) { if (obj.isStaff()) { // obj的类型被缩小为 Staff } else if (obj.isStudent()){ // obj 的类型被缩小为 Student } }
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
在本教程中,我将向大家展示如何使用 Laravel + Vue 3 使用 typescript 和 Vite 设置你自己的单页应用程序。
这是在 Laravel 项目中添加 PWA 的手动方法。我们不会使用 InertiaJS 或其他类似的东西,我们也不会混合使用。我们将手动实现我们自己的 VueJS 前端。
composer create-project laravel/laravel laravel-vue-manual
在我们的 laravel 项目中,让我们使用 yarn 运行一个命令,并选择 vue 和 typescript。
yarn create vite
将项目名称设置为:FrontEndApp
选择:Vue
选择:TypeScript
然后转到我们的FrontEndApp目录并运行yarn或yarn install安装依赖项。
配置 Vite
让我们配置我们的 vite 配置FrontEndApp\vite.config.ts
import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; export default ({ mode }) => { // 检查是否开发 const isDevelopment = mode === "development"; return defineConfig({ server: { port: 3000, }, build: { // 生成的文件将添加到此处 outDir: "./../public/app", }, // 也将更改基于模式的基础 base: isDevelopment ? "/" : "/app/", plugins: [vue()], }); };
然后让我们更改build脚本FrontEndApp\package.json,这样每次我们构建它时都会替换以下文件public/app:
{ ... "scripts": { "dev": "vite", "build": "vue-tsc --noEmit && vite build --emptyOutDir", "preview": "vite preview" }, ... }
现在,如果我们在FrontEndApp中运行yarn build
,它应该在laravel项目的根目录中的public
文件夹中创建一个名为 app 的文件夹。
让我们设置我们的 laravel 路由,以便我们可以访问我们刚刚创建的文件。
让我们编辑这个文件 routes\web.php
<?php
use Illuminate\Support\Facades\Route; Route::get('/', function () { return view('welcome'); }); Route::get('/app/{any}', function () { $path = public_path('app/index.html'); abort_unless(file_exists($path), 400, 'Page is not Found!'); return file_get_contents($path); }) ->name('FrontEndApp');
现在,如果我们http://127.0.0.1:8000/app
在浏览器中打开,我们现在可以看到我们的应用程序已启动。
我们将在我们的根项目目录中添加一个开发包,并同时调用它。我们用它来一次运行 2 个或更多命令。
安装:
yarn add -D concurrently
如果我们想要自动工作,不想每次使用时都重新构建frontednapp,我们要做的是在package.json项目的根目录中添加一个新脚本。
{ ... "scripts": { ... "front:serve": "cd FrontEndApp && yarn dev", "front:build": "cd FrontEndApp && yarn build", "serve": "concurrently \"php artisan serve --port=8080\" \"yarn front:serve\"", "deploy": "yarn setup && yarn front:build && php artisan migrate" }, ... }
这样, running yarn serve
将同时运行 127.0.0.1:8080
和 localhost:3000
。你现在可以同时使用这两个项目。
完成 FrontEndApp 的工作后,你可以运行 yarn deploy
以构建我们的前端。
我相信这也是大家可以在 laravel 项目中添加 pwa 的一种方式,这样你就可以将它们保存在一个项目中。
考虑到这一点,你可以添加routes到你的 FrontEndApp 项目中,还可以添加状态管理器PiniaJA,例如 等等。
《Vue.js 快速入门实战》
【内容简介】
Vue.js 快速入门实战以Vue.js的知识点为基础,结合TypeScript的使用,循序渐进地介绍了Vue.js 3.0(简称Vue3)的知识点和实战技巧,可以帮助零基础的读者掌握独立开发项目和部署项目上线的技术。全书共14章,包括Vue.js概述、搭建开发环境、Vue.js组合式API、Vue.js的模板语法、Vue.js的计算属性和侦听器、Vue.js中class和style的绑定、Vue.js的表单开发、Vue.js的组件开发、Vue.js的网络请求、Vue.js的状态管理、Vue.js的路由管理、Vue的项目部署、在线招聘网站开发实战以及招聘网站后台管理系统开发实战。
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
目录
computed计算属性: 依赖其他的值,有缓存, 当它依赖的属性值发生改变,在下次获取computed的值时,才会重新计算computed值,而watch监听器,更多的是起到监听的作用,它没有缓存,每当监听的数据发生了都会执行回调进行后续的操作.
例如老板要让你使用组件写分类栏,然后使用该组件生成两个分类栏,这两个分类栏里的数据都不一样,但是整体结构是一样的,这就要求组件的结构一样,但是内部 DOM 结构是由使用组件的时候决定的,这就需要插槽,其就像放在组件中的占位标签,使用组件时我们将要放到占位标签处的DOM结构写入组件标签体中即可。
例如如下图例子,第一个分类框我们要展示热门电影,第二个分类框我们要展示一张风景图,整体的框架是一样的,只是其内部填充的东西不一样下面会做出更深刻的理解。
![]()
此板块我们讲述第一个插槽:默认插槽。之前我们使用组件的时候,引入进 App.vue 后注册就可以采用 自闭合 与 完整组件标签 的方式使用,以下就是常采用的自闭合与完整组件标签方式(以 test组件为例)
<template> <test/> //自闭合方式 <test></test> //完整组件标签的方式 </template>但是插槽的使用我们就要把要放在插槽中的内容写在组件标签体内,例如我们要在插槽中放入一个 ul 列表,那么我们使用组件时就要这样书写:
<template> <test> //组件标签 <ul> <li></li> <li></li> <li></li> </ul> </test> </template>接下来说说默认插槽的写法,如果我们只在使用组件时的组件标签体内写上内容,那页面上是显示不出来任何东西的,这是因为标签体内的内容确实被解析了,但是vue不知道要把这些东西放在组件中 template 的哪个位置,故我们要在组件的 template 中设置一个插槽来占位,以保证使用组件时其解析的内容可以放入占的位置中去。占位我们使用一个很重要的标签 ------ slot,我们需要在组件的 template 中这样书写:
<template> <div> <span>我是一个组件,下面是我的插槽内容</span> <slot></slot> //默认插槽 </div> </template>这样使用组件时组件标签体中的内容就可以放入组件的默认插槽中了
我们来实现一下上述的分类案例,让第一个分类展示电影,第二个分类放一张图片进去,但整体组件结构一样
classify.vue组件:
-
<template>
-
<div class="classify-box">
-
<div class="title">{{name}}</div>
-
<slot></slot> //slot设置默认插槽来占位
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name:'Classify',
-
data() {
-
return {
-
}
-
},
-
props:['name'] //propos接收传来的标题名称
-
}
-
</script>
-
-
<style scoped>
-
//css太占地方就删掉了
-
</style>
App.vue组件:
-
<template>
-
<div class="app-box">
-
<Classify name='热门电影'> //使用组件并在组件标签体中书写要放进插槽中的内容
-
<ul>
-
<li>肖申克的救赎</li>
-
<li>1912</li>
-
<li>零的执行人</li>
-
</ul>
-
</Classify>
-
<Classify name="风景">
-
<img src="./img/QQ图片20220818163031.jpg" alt="">
-
</Classify>
-
</div>
-
</template>
-
-
<script>
-
import Classify from './components/classify.vue' //引入组件
-
export default {
-
name: 'App',
-
data() {
-
return {
-
}
-
},
-
components: {
-
Classify:Classify //注册组件
-
}
-
}
-
</script>
-
-
<style scoped>
-
//css太占位置删掉了
-
</style>
这样就可以实现一个最基本的默认插槽案例了
具名插槽其实只是在默认插槽的基础上给每个插槽起了名字,作用为可以在组件中设置多个插槽,可以更具体细分。首先给组件插槽起名字,使用 name="xxx"。
<template> <div> <span>我是一个组件,下面是我的多个具名插槽内容</span> <slot name="header"></slot> //header具名插槽 <slot name="body"></slot> //body具名插槽 <slot name="footer"></slot> //footer具名插槽 </div> </template>上面就在组件中定义好了三个具名插槽,下面我们来看使用插槽的写法,依旧是在使用组件标签时在标签体内写入内容,但是要注意要使用 slot="xxx" 写在组件标签体外层盒子上来指明放入哪个插槽中
<template> <div class="app-box"> <Classify> <div slot="header"> //放入header插槽 <span>我在header插槽中</span> </div> <div slot="body"> //放入body插槽 <span>我在body插槽中</span> </div> <div slot="footer"> //放入footer插槽 <span>我在footer插槽中</span> </div> </Classify> </div> </template>![]()
上面的写法其实并不完善,slot写在每个指定插槽的外层大盒子 div 上了,这样会给其增加一层 DOM 结构,我们最好把 div 换成 template 标签,因为 template 标签不会被解析,结构更清晰不多余。
下面简单实现一下具名插槽的使用
classify.vue组件:
-
<template>
-
<div class="classify-box">
-
<div class="title">下面是具名插槽的内容</div>
-
<slot name="header"></slot>
-
<slot name="body"></slot>
-
<slot name="footer"></slot>
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name:'Classify',
-
data() {
-
return {
-
}
-
},
-
}
-
</script>
-
-
<style scoped>
-
-
</style>
App.vue组件:
-
<template>
-
<div class="app-box">
-
<Classify>
-
<div slot="header">
-
<span>我在header插槽中</span>
-
</div>
-
<div slot="body">
-
<span>我在body插槽中</span>
-
</div>
-
<div slot="footer">
-
<span>我在footer插槽中</span>
-
</div>
-
</Classify>
-
</div>
-
</template>
-
-
<script>
-
import Classify from './components/classify.vue'
-
export default {
-
name: 'App',
-
data() {
-
return {
-
-
}
-
},
-
components: {
-
Classify:Classify
-
}
-
}
-
</script>
-
-
<style scoped>
-
-
</style>
这样就简单实现了具名插槽
作用域插槽较难理解,但其简单解释就是带有数据的插槽,把组件中的数据绑定给插槽,然后谁使用这个组件谁就能拿到这个数据使用,也相当于一种数据通信,其需要这样把数据绑定定义给组件插槽(名称没有要求)
<template> <div class="classify-box"> <div class="title">下面是作用域插槽的内容</div> <slot :hobby="hobby"></slot> //将数据绑定给组件插槽 </div> </template> <script> export default { name:'Classify', data() { return { hobby:['打游戏','睡大觉','吃大餐'] //要绑定的数据 } }, } </script>![]()
然后就要使用组件时使用 slot-scope="xxx" 去接收,或者直接使用 scope,要注意的是此处标准一点最好写在 template 中,这里的 xxx 不需要和组件插槽中起的名字一样,随便起就行。然后我们打印一下接收到的数据看看其是什么
<template> <div class="app-box"> <Classify> <template slot-scope="datas"> <div>{{datas}}</div> </template> </Classify> </div> </template>
![]()
可以看到我们接受到了一个对象,对象中包含的是你插槽中绑定的所有数据(我们只绑定了一个所以对象里只有一组数据),对此我们就能在组件标签体中使用得到的数据了
下面简单实现一下作用域插槽的使用
classify.vue组件:
-
<template>
-
<div class="classify-box">
-
<div class="title">下面是作用域插槽的内容</div>
-
<slot :hobby="hobby"></slot>
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name:'Classify',
-
data() {
-
return {
-
hobby:['打游戏','睡大觉','吃大餐']
-
}
-
},
-
}
-
</script>
-
-
<style scoped>
-
-
</style>
App.vue组件:
此处 slot-scope 接收的数据使用了es6解构把数据解构出来了
-
<template>
-
<div class="app-box">
-
<Classify>
-
<template slot-scope="{hobby}">
-
<ul>
-
<li v-for="(h,index) in hobby" :key="index">{{h}}</li>
-
</ul>
-
</template>
-
</Classify>
-
</div>
-
</template>
-
-
<script>
-
import Classify from './components/classify.vue'
-
export default {
-
name: 'App',
-
data() {
-
return {
-
-
}
-
},
-
components: {
-
Classify:Classify
-
}
-
}
-
</script>
-
-
<style scoped>
-
-
</style>
这样就简单实现了作用域插槽的案例
感谢支持'
来源:csdn
蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~
希望得到建议咨询、商务合作,也请与我们联系01063334945。
分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
画面平衡是一个很基本的设计理念,但很多朋友在平时的作品中容易忽视这个点。彩云在星球中帮不少朋友看过作品集,发现最多的问题之一就是画面平衡没做好,我觉得只要把这个基本问题解决了,作品就能提升一个档次。
用户本能地会对不平衡的设计感到厌烦,如何在画面中创造一个有吸引力的平衡?是本篇文章要分享的内容。
平衡是一个作品中最重要的元素之一。平衡中的对称关系能够创造平衡与和谐,这种平衡状态直观上能够让用户感到舒适。
人体是垂直对称的,我们的视觉接收也与之相对应。我们喜欢物体在垂直轴上保持平衡,直觉上总是倾向于平衡一种力量与另一种力量。
在设计环境中,平衡是基于元素的视觉重量,而视觉重量是用户对图像的注意力范围。如果画面是平衡的,用户会下意识地感到舒适。画面平衡被认为是其元素在视觉上的比例安排。
如何让一个页面看起来平衡?
最常见的平衡例子就是使用对称。
在潜意识层面上,对称的视觉能让人愉悦,能让画面看起来和谐有条理。对称的平衡是通过在水平或垂直的中轴两侧均匀放置元素来创造的。也就是说,画面中间假想线的两边实际上是彼此的镜像。有些人认为对称的平衡是无聊和可预测的,但它经受住了时间的考验,到现在仍然是在页面上创造舒适和稳健感觉的最好方法之一。
二、不对称(动态)平衡
两侧重量不相同的元素构成具有不对称平衡。
动态平衡通常会比静态平衡更有设计感,让画面不至于呆板。在缺乏平衡的情况下,我们的目光会条件反射性地开始寻找平衡点,这是一个很好的机会,可以将注意力吸引到页面上可能还没被注意到的部分。页面重点就应该放在这里——抓住用户的注意力,就像产品的生命线一样。
比如一般这样去“配重”的元素会是一个按钮或者标题。
重要信息(或者是行动按钮)就是我们需要去配重的价值元素。
不对称的现象越严重,用户就越想找出其中的原因(检查配重)。人们本能地比平时更仔细地研究这样的画面。然而,这里需要注意分寸,过于古怪的构图并不总是能被很好的感知。
平衡中的另一种类型,特点是视觉元素从一个共同的中心点放射出来。径向平衡在设计中不常用。它的优点是,注意力很容易找到并保持一个焦点——恰好就在它的中心,这通常是构图中最引人注目的部分。
这是一种平衡中的混乱,就像 Jackson Pollock的画作一样。这样的组成没有突出的焦点,所有的元素都有同样的视觉重量。没有层次,乍一看,画面就像视觉噪音,但所有元素又相互匹配,形成一个连贯的整体。
(彩云注:这是一种比较高阶的设计平衡处理手法,用的好可以让画面非常具有设计感,但把握不好的话,就会非常凌乱。所以,我们平时能看到很多大师的作品看似一些简单图形的使用,但就是好看,轮到自己设计的时候就会发现,越简单的设计似乎越难设计好。)
五、视觉平衡的秘密?
当谈到构图中的重量平衡时,他们经常将其与物理世界中的重量进行比较:重力、杠杆、重量和支点。我们的大脑和眼睛感知平衡的方式非常类似于力学定律。我们很容易把一幅画想象成一个在某一点上平衡的平面,就像一个天平。如果我们在图像的边缘添加一个元素,它就会失去平衡,有必要修复它。元素是否是一组色调、颜色还是点并不重要,目标是找到图像的视觉“重心”,即图像的重心。
不幸的是,没有精确的方法来确定一个物体的视觉质量。一般来说,设计师依赖于他们的直觉。不过,下面这些有用的观察可能会有所帮助:
1)大小
大的物体总是更重。
2)形状
不规则形状比规则形状的元素轻。
3)颜色
暖色比冷色重。
4)色调
深色物体比浅色物体重。
5)图案
带有图案的元素显得更重。
6)3D
带有纹理贴图的元素显得更重。
7)位置
物体离中心越远,其视觉重量越大。
8)方向
垂直元素比水平元素更重。
9)密度
许多小元素可以抵消一个大元素。
10)内部复杂性
物体内部越复杂,视觉重量更大。
11)填充空间关系
正形空间比负形空间更重。
12)对重量的感知
照片中的哑铃看起来会比一只钢笔更重。
当使用对称时,作品看起来可以更加的专业和有科学性。其中,静态对称的作品显得更加有专业精神和严肃的;而动态对称的设计方法则能吸引用户的兴趣,表达出个性和创造力,能让用户集中注意力。
作者:彩云sky
来源:人人都是产品经理
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
过去一年,一些新词频繁在行业中出现。诸如“元宇宙是什么?NFT能赚钱吗?AIGC前景在哪里?虚拟数字人怎么带货?XR有未来吗”这样的问题,不断被提及和讨论。
或许是因为行业内卷带来的焦虑,很多人渴望在新世界中寻求红利,发掘机会,2022年也确实涌现出不少新行业、新趋势。
今天,新榜编辑部筛选出去年最值得关注的6大行业新趋势,希望能和各位一起回顾2022,展望2023。
以Meta为代表,元宇宙堪称2022年最火的商业概念之一。
自2021年10月将Facebook更名为Meta,虽然饱受质疑,但扎克伯格对元宇宙的投入堪称坚决。有报道称Meta2022年在元宇宙上的研发投入高达百亿美元。
2022年1月18日,微软宣布以687亿美元收购动视暴雪,希望为微软构建元宇宙打下基础。据麦肯锡公司估计,2022年前五个月,企业、私募股权公司和风险资本家共进行了总额高达1200亿美元的元宇宙相关投资。
而在国内,更是呈现出一片热闹景象。
城市方面,除了上海发布《上海市培育“元宇宙”新赛道行动方案(2022—2025年)》外,深圳、成都、杭州等城市也有元宇宙相关规划或园区布局。
图源:上海市人民政府
大厂方面,腾讯上线“超级QQ秀”,字节上线“派对岛”,快手内测基于“附近同城”的虚拟形象社交,抖音上线虚拟空间“抖音小窝”,芒果上线元宇宙平台“芒果幻城”,映客更是宣布更名“映宇宙”,要全面进军元宇宙。
腾讯的“超级QQ秀”和字节的“派对岛”
2022年11月17日,B站董事长陈睿谈及“B站元宇宙构想”时曾称B站是中国最适合去实现“元宇宙”概念的公司之一。
但热闹非常的元宇宙也饱受质疑。在拥护者看来,元宇宙会是下一代互联网,被称为“元宇宙第一股”的沙盒游戏平台Roblox还总结了元宇宙的八大要素:身份、朋友、沉浸感、低延迟、多元化、随时随地、经济系统和文明。
但在质疑者看来,元宇宙只不过是一次旧技术的拼接,是一个营销游戏。中国工程院院士邬贺铨认为,元宇宙不会是下一代互联网。元宇宙是现代信息技术的集成,它涉及5G、IP网、云计算、人工智能、虚拟现实、区块链、数字货币、物联网、人机交互等,要满足元宇宙的技术需要,几年之内还不太可能。
2022年2月11日,元宇宙社交App“啫喱”曾一度超过微信、QQ,登上AppStore第一,但爆火3天后,就宣布主动下架。同年10月,字节的同类产品“派对岛”,同样在上线3个月后宣布裁撤团队;8月底,号称要成为“元宇宙时代的微软”的影创科技被曝欠薪200多人。
同年8月中旬,扎克伯格曾发布自己的一张虚拟自拍照,结果遭全网群嘲。截至当前,Meta已经连续第四个季度利润下滑。
不过就在2022年12月19日,Meta发布博客《为什么我们仍然相信未来》,表示将继续把20%的支出用于投资VR部门Reality Labs,这是他们元宇宙计划不可或缺的一部分。
显然,扎克伯格始终坚信元宇宙会是未来。
我们认为,受限于技术,类似头号玩家那样的全真元宇宙仍然非常遥远,但聚焦工业、娱乐等特定领域的元宇宙产品已开始初步落地。2023年,元宇宙也许能出现更具想象力的产品。
2022年或许可以说是AIGC元年。
AIGC(AI-Generated Content,人工智能生成内容)按照模态区分,可分为音频生成、文本生成、图像生成、视频生成等细分领域,以及文字生成图片、文字生成视频等跨模态生成。
引起热议的AI绘画获奖作品《太空歌剧院》
很多人是从2022年爆火的AI绘画开始了解AIGC的:4月Midjourney内测,7月Stable Diffusion横空出世,10月二次元模型NovelAI走红,11月无数人试图驯服AI绘画小程序,层出不穷的AI工具让人们看到了AI在艺术创作方面蕴藏的巨大潜力,同时也引起了猛烈的质疑和抗议:关于版权与道德,关于公平、安全、责任,关于人类和机器之间的关系。(相关阅读:《不明觉厉的AI绘画,对内容创作者来说有什么用?》《千万网友试图驯服的AI绘画,背后谁在赚钱?》)
到了2022年年底,对话式AI语言模型ChatGPT惊艳了海内外网友,它像人一样可以连续对话,帮助人们写作、写代码、回答一些常识性、生活性问题等,尽管有时会一本正经地胡说八道,但AI生成内容的能力已经突破我们的想象。(相关阅读:《刷屏的ChatGPT能帮自媒体人写稿吗?我们帮你试了试》《27个问题,让新晋懂王ChatGPT教我做网红》)
从PGC到UGC再到AIGC,内容生产范式的改变是大趋势,AI正在愈加渗透内容行业。
AIGC相关公司,图源硅谷Leonis Capital
百度创始人李彦宏曾在2022年7月的百度世界大会上表示:“AIGC或许将颠覆现有内容生产模式,实现以‘十分之一的成本’,以百倍千倍的生产速度,去生成AI原创内容。”
不过,目前国内的AIGC行业尚未进入大规模落地和体系化发展阶段,仍处于发展初期,大力投入大模型研发和落地的主要以大型云厂商为主,还有一些将AI技术产品化的互联网大厂和初创公司。除了存在算力成本高、技术不完善等难题外,C端用户的付费意愿也比较有限。
相对来说,B端客户的可发展空间较大,据Forrester预估,2023年财富五百大企业中将有1成通过AI工具创造内容,因为人工制作内容的速度永远无法大规模满足定制化内容需求。
图片来源:西湖心辰创始人蓝振忠在知乎的演讲
2023年可能会有越来越多的企业和个人使用AI来提高内容生成效率,激发创作灵感。正如Stability AI的CTO Tom Mason在极客公园的大会上提到的:“生成式AI正在做的,就是让消费者成为创作者,给他们创作他们自己消费的媒体内容的能力。”他判断,继文字生成图像后,下一波浪潮肯定是视频、音频和3D。
相比元宇宙,虚拟数字人可能更“实在”一些,至少是已经可见的。
关于虚拟数字人,新榜编辑部曾在“虚拟人专栏”中推出系列文章:《造价从100元到100万,虚拟人究竟是什么?》《90%玩家处在早期阶段,虚拟人靠什么赚钱?》《虚拟人四大难题:技术、产品、市场、中之人》。
按照“技术炒作周期曲线”
虚拟数字人行业正处于期望顶峰期
一个普遍共识是,目前虚拟人行业仍处于早期阶段,杀手级产品也尚未出现。也因此,去年虚拟人行业的一个主旋律是各类粉墨登场的虚拟数字人。
抖音方面,许安一、金桔2049等依靠直播成为了人气网红;快手方面,狐璃璃40天涨粉百万,快手技术团队还推出“快手虚拟演播助手KVS”;B站方面,海外虚拟主播vox的直播首秀,当晚直播1.7小时,营收达111万元。
此外,蒙牛、雪花啤酒、长安汽车等品牌也相继推出了自己的虚拟代言人。
虚拟数字人背后,则是动作不断的虚拟数字人公司、平台。
李未可科技、魔珐科技等相继完成融资,前者由字节独家投资,后者则由红杉中国等投资机构投资,B轮、C轮融资总金额达1.3亿美元。
百度除发布AI数字人希加加外,百度智能云曦灵还推出了两大SaaS平台“数字明星运营平台1.0”及“数字人直播平台2.0”,不断加码虚拟数字人基建。
2022年6月8日,日本知名虚拟主播事务所彩虹社成功登陆资本市场,成为VTuber界首家上市公司。在其招股书上,B站位列第三大股东。
企查查数据显示,截至2023年1月初,国内虚拟人/虚拟偶像相关现存企业近5千家,其中2022年共新注册1300余家,同比增长超25%。
政策方面同样传来利好消息。《北京市促进数字人产业创新发展行动计划(2022—2025 年)》《虚拟现实与行业应用融合发展行动计划(2022-2026年)》等政策相继发布,虚拟数字人价值得到肯定。
目前,业内普遍相信虚拟数字人的价值,但受限于技术、运营,如何发挥其价值仍然存在不小的难题。
2022年5月10日,国内虚拟偶像团体A-SOUL成员珈乐宣布进入“直播休眠”状态,引发粉丝极大不满,也由此引发对中之人的相关讨论。目前,市场对虚拟数字人的接受度仍是一个未知解。
截至目前,虚拟数字人已经尝试了广告、电商以及短视频、直播等多种形式、场景的应用,但仍处于尝鲜阶段,未出现普遍性的成功案例。
合理推测,谁能率先实现技术突破,孵化出第一个现象级虚拟数字人IP,谁就能第一个吃到红利。
历经多年市场低迷期,2022年,基于XR的技术、设备和内容生态受到了越来越多的消费者关注。
XR(Extended Reality,扩展现实)是指通过计算机将现实与虚拟相结合,打造一个人机交互的虚拟环境,涵盖虚拟现实(VR)、增强现实(AR)和混合现实(MR)等多种沉浸式技术。就像智能手机是移动互联网的入口一样,未来,XR设备被广泛认为是元宇宙的重要入口。
12月,国产AR眼镜Nreal的累计产量已达成10万台
Meta、苹果、谷歌、三星、字节跳动、腾讯、华为、爱奇艺等国内外科技巨头均有布局XR赛道。其中,Meta旗下VR产品Oculus系列在全球VR市场的占有量遥遥领先,字节跳动旗下的PICO系列位居全球第二,并在国内市场稳居第一。
XR设备双11销售榜单,图源天猫
2022年下半年,PICO 4和Meta Quest Pro的发布又掀起了VR硬件的市场热潮。可以看到,技术的进步带动了消费体验的提升,比如Pancake方案的规模化商用让VR一体机变得更小巧,彩色透视让VR向MR应用跨越。
PICO宣传图
PICO总裁周宏伟曾在接受采访时表示,目前VR行业虽然产品硬件在每一代都有进步,但整体上还是处于比较早期的阶段,用户基数比较少,还有很大的发展空间,“现在的大环境不是你死我活的问题,是你活我活的问题”。
一直以来,XR领域的护城河并不是硬件,很大程度上需要优质的内容生态来推动设备普及。
目前VR设备的应用场景主要集中在游戏社交和影视直播。
作为最大的VR内容平台,Steam截至2022年底已经有超7000款支持VR的游戏和应用。11月,PICO“轻世界”正式公测,提供各种3D场景创作工具和操作方式,希望开放生态让更多玩家在VR世界里创作内容。但相对来说,国内的VR平台内容生态还是略显薄弱,首发、独占内容较少,还处于“易落灰”的阶段。(相关阅读:《看完VR版世界杯总决赛,聊聊我对PICO 4的使用体验》)
根据IDC全球增强现实和虚拟现实头显季度跟踪报告的最新数据,2022年,全球VR头显和AR设备的出货量下降12.8%,降至970万台,预计2023年将恢复增长。出货量大降除了大环境的影响,XR产品本身及相关生态不够完善仍是主要原因。
展望2023年,XR产业正在进入一个新的发展阶段。苹果MR设备、索尼PS VR2等更多新产品或将登场,各类应用场景也等待着创业者和用户不断发掘。随着《虚拟现实与行业应用融合发展行动计划(2022-2026年)》的发布,国内XR市场也迎来政策利好。
罗永浩曾提到,AR行业正处于一两年后就能实现大规模商业化的节点,在科技巨头大规模入场之前,目前正是创业公司入局的好时机。
我们认为,除了产品形态的创新,内容生态的建设可能才是接下来XR大众化的关键,不仅是游戏,社交、办公、健身、视频、演唱会等多维度内容都需要共同发展,虚实之间,存在极大的发展机遇。
背靠区块链技术,数字藏品成为“元宇宙”概念下最快的变现途径之一。
2021年底NFT在海外爆火,2022年国内以“数字藏品”之名对NFT进行了本土化改造,迎来了快速发展。据国家语言资源监测与研究中心,“数字藏品”入选2022年度十大新词语。
数藏使用区块链技术为作品生成相对应的数字凭证,具有可追溯、难以篡改、唯一性等特点。知名IP作品上链限量发售,既可以保护原创版权,又能用新概念进行营销宣传,具备稀缺性和收藏价值。数藏和NFT的主要区别在于国内数藏禁止加密货币炒作,不开放二级市场;以联盟链为主,创作及定价方式由平台方决定。
整体来看,数藏行业在2022年经历了从爆发式增长到陷入寒冬的大起大落。
起初“万物皆可数藏”,国内媒体、政府、互联网平台等多与文博、书画、影视、艺术家合作发行数藏,明星名人也引领了一波数字时尚风潮。腾讯、阿里、百度、京东、B站、小红书等新老大厂纷纷布局数字藏品,据不完全统计,国内大大小小的数藏平台已经超过1000家。(相关阅读:《B站UP主定制的数字藏品,谁来买单?》《从爆火到理性,数字藏品还值得创作者入局吗?》)
图片来源:元飞船数藏舰
空投、合成、白名单、IP赋能……火热市场背后却是一片炒作乱象。很快,监管部门相继发布对数藏合规化的倡议。
2022年下半年,国内数藏市场虚假繁荣的泡沫开始显现,不乏平台暴雷、创始人“跑路”导致用户维权等现象,头部平台的藏品也出现了滞销情况。同年8月,腾讯幻核体面退场;10月~11月,至少有超过60家数藏平台主动发布清退公告。
即使在国外,加密货币交易所FTX崩盘之前,NFT市场就已经受到加密寒冬的影响,截至2022年底,日交易量从近10亿美元的高位下降到仅1800万美元。
据速途元宇宙研究院,目前数字藏品熊市的原因是供需关系的反转,“通货膨胀”的藏品缺乏与用户之间的联系或附加权益,难以产生更多价值增量。
很多新事物在发展初期都不可避免地产生投机炒作现象,只有当行业回归理性,虚火褪去后,数藏的价值才能真正显现出来。
NFT和数藏是区块链的新生产力发展带来的生产关系创新变化,高樟资本告诉新榜编辑部,这种生产关系对于解锁、赋能精神消费领域的生产力的作用是深远的,他们仍然看好该市场未来的机会和空间。
数字藏品行业全景图谱,图源亿欧智库
2023年起,国家队正式入场,全国首个国家级合规数字资产二级交易平台——“中国数字资产交易平台”于元旦上线。这标志着包括数字藏品在内的数字资产二级交易市场将迎来合规健康可持续发展阶段。
在合规趋势下,我们认为,数藏平台会趋向细分化,比如与实体经济的垂直领域进一步结合,或者融入AIGC,加强社区运营和赋能创作者生态,这些都是未来可能的发展方向。
Web3.0在2022年的第一波热度从一款游戏开始。
StepN,这款由浙大毕业生开发的Web3.0 App,曾在短短几个月时间里就卖出了上百万双虚拟鞋,月收入一度超过1亿美元。
财富效应之下,Web3.0成为2022年的显学之一。
2022年1月,NFT市场OpenSea的月交易量超过50亿美元;2月,红杉资本宣布推出一支专注于投资Web3.0相关技术创业公司的基金,资金规模在5亿至6亿美元之间;11月,耐克宣布将推出一个新的Web3.0平台Swoosh。目前,包括谷歌、Meta、阿里、腾讯等数十家大公司都开始探索Web3.0相关业务。
a16z在Web3.0的生态布局。图源:36氪
如何抓住Web3.0的机会?第一步就是要搞清楚什么是Web3.0。这也是Web3.0在2022年的重要主题之一。
因为Web3.0涵盖了区块链、数字货币、智能合约、DAO、DeFi、SciTS、CeSMO、CMO、DeSci、DeSoc、DeEco等一系列复杂概念,时至今日,仍然没人能给出一个服众的定义。
目前传播度最广的Web3.0定义来自研究员Eshita:Web1.0的特征是“可读”;Web2.0的特征是“可读+可写”;Web3.0的特征则是“可读+可写+拥有”。去中心化、确权、互联互通则是在Web3.0的相关讨论中最常出现的几个关键词。
但与此同时,特斯拉创始人马斯克曾表示“我不认为Web3.0真实存在,现在更像是市场营销的热词”,推特前首席执行官多尔西则认为“用户并不实际拥有Web3.0产品,Web3.0的实际拥有者是项目背后的风投机构,及其有限合伙人”。
因为共识的缺失,Web3.0显现出冰火两重天般的境遇。有人热情拥抱,有人态度谨慎,有人充满质疑。
2022年10月,周星驰在Instagram上公开招募Web3.0人才
截至目前,针对Web3.0数字资产的金融监管,美国仍未形成统一的监管架构,呈现出“多头监管”的态势。而在国内,强监管则是Web3.0从业者最大的共识。
回看去年,Web3.0就仿佛是一个充斥疯子、骗子、傻子以及理想主义者的蛮荒世界,每个人都希望能在Web3.0身上得到自己想要的。
2022年9月15日14时,以太坊正式完成“合并”,结束了区块链对挖矿的依赖,也成为Web3.0历史上的一个里程碑。但在2023年Web3.0能否迈入新的历史阶段,目前仍是一个未知数。
我们认为,Web3.0现在最大的困难在于如何从概念炒作转向项目落地,为市场提供一个真正的杀手级产品,只有如此,Web3.0才能真正获得持久的生命力,摆脱割韭菜的质疑。
不断涌现的新技术、新产品正为创作者和内容行业注入新的活力,我们相信,2023年会是充满可能性的一年,面对方兴未艾的技术应用和热点话题,新榜编辑部也将继续关注和跟踪,与你一起探讨和见证内容行业的大变革。
作者:新榜
来源:人人都是产品经理
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.
Linux & Mac OS (windows git bash)
export NODE_OPTIONS=--openssl-legacy-provider
windows命令提示符:
set NODE_OPTIONS=--openssl-legacy-provider
(1) 鼠标双击nvm-setup.exe文件,选择“我接受…”那一行,点击next
(2) 可以根据自身情况自定义选择路径盘,路径不要出现空格或中文符号(路径最好是在路径盘的根目录下,如C盘、D盘下的根目录),选好后点击next
(3) 选择node.js的安装位置,可以根据自身情况自定义选择路径盘,路径不要出现空格或中文符号(路径最好是在路径盘的根目录下新建一个文件夹,如C盘、D盘下的根目录),选好后点击next。(若系统中已经安装node.js,则cmd打开终端,输入where node,查看node的位置,选择此文件目录)
(4) 最后一步,点击install即可安装完成
进入命令控制行窗口(win+R,输入cmd),
输入nvm -v
,出现版本号即成功。
(1) 输入命令行nvm ls available查看可用的node.js版本号
若报错:Could not retrieve https://nodejs.org/dist/latest/.....
则打开nvm的安装目录,打开settings.txt文件,增加2行,然后保存
node_mirror:https://npm.taobao.org/mirrors/node/
npm_mirror:https://npm.taobao.org/mirrors/npm/
(2) 输入命令行nvm install node版本号(例如:nvm install 16.17.0)
(3) 安装成功后,输入命令行nvm use node版本号(nvm use 16.17.0)
若报错exit status 1: ��û���㹻��Ȩ��ִ�д˲�����
则权限不够,以管理员身份运行cmd
具体方法:点击电脑左下方搜索->输入cmd->以管理员身份运行(命令提示符)->重新输入nvm use
(4) 验证是否成功
分别输入命令行node -v和npm -v,检验node.js以及对应npm是否安装成功,如果可以显示版本号这说明安装成功。
小窍门:
1.输入命令行nvm ls可查看你安装的所有node.js版本号,以及你当前所选择的node.js运行版本
(2) 如果想删除某node.js版本的话,输入命令行nvm uninstall node版本号(例如:nvm uninstall 18.10.0)即可删除对应版本
npm run dev
来源:csdn
蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~
希望得到建议咨询、商务合作,也请与我们联系01063334945。
分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
TypeScript从入门到实践专栏是博主在学习和工作过程中的总结,实用性非常强,欢迎订阅哦,学会TS不迷路。
TS系列 | 标题 |
---|---|
基础篇 | TS入门(一) |
基础篇 | TS类型声明(二) |
基础篇 | TS接口类型(三) |
基础篇 | TS交叉类型&联合类型(四) |
基础篇 | TS类型断言(五) |
基础篇 | TS类型守卫(六) |
进阶篇 | TS函数重载(七) |
进阶篇 | TS泛型(八) |
进阶篇 | TS装饰器(九) |
对于同一个函数我们在不同场景下传参,参数有时候全部需要,有时候部分需要,定义多个同名函数就会报错,那么该怎么实现这个操作呢?我们可以为函数设置默认参数和可选参数。
给每个参数添加类型之后,可以不用给函数本身添加返回值类型,因为TS能根据返回语句自动推断出返回值类型
function start(name:string,age:number,phone?:number,sex?:string):string{ if(phone&&sex){ return `name:${name},age:${age},phone:${phone},sex:${sex}` }else{ return `name:${name},age:${age}` } } start('zhangsan','14')//name:zhangsan,age:14 start('zhangsan','14',15678777777,'男')//name:zhangsan,age:14,phone:15678777777,sex:男
另外我们看它编译后的样子,其中返回值使用了concat
来连接字符串,也让我们学习到模版字符串的实现原理。
function start(name, age, phone, sex) { if (phone && sex) { return "name:".concat(name, ",age:").concat(age, ",phone:").concat(phone, ",sex:").concat(sex); } else { return "name:".concat(name, ",age:").concat(age); } } start('zhangsan', 14); //name:zhangsan,age:14 start('zhangsan', 14, 15678777777, '男'); //name:zhangsan,age:14,phone:15678777777,sex:男
但是我们要是有很多场景,参数类型也都不一致,我们这样写很难维护,并且定义的规范很难适用于实际多个场景,那么我们可以使用函数重载来处理。
什么事函数重载呢?当我们多次调用函数时传递不同参数数量或者类型,函数会做出不同处理。
这里介绍个名次「函数签名」,顾名思义,函数签名主要定义了参数及参数类型,返回值及返回值类型。函数签名不同,函数会做出不同的处理,这是我对函数重载的理解。
举个例子,声明一个类Course
,里面写一个start
的方法,我们调用 start
时传入不同参数类型已经参数个数,start方法会做出不同处理,那么怎么实现呢?具体如下:
type Combinable = number | string; class Course { //定义重载签名 begin(name: number, score: number): string; begin(name: string, score: string): string; begin(name: string, score: number): string; begin(name: number, score: string): string; //定义实现签名 begin(name: Combinable, score: Combinable) { if (typeof name === 'string' || typeof score === 'string') { return 'student:' + name + ':' + score; } } } const course = new Course(); course.begin(111, 5);//没有输出 course.begin('zhangsan', 5);//student:zhangsan:5 course.begin(5, 'zhangsan');//student:5:zhangsan
![]()
以上代码中定义了4个重载前面和1个实现签名。
声明一个函数arithmetic
,参数类型为联合类型,返回值也是联合类型,但是如下代码却报错了。
function arithmetic(x: number | string): number | string { if (typeof x === 'number') { return x; } else { return x+'是字符串'; } } arithmetic(1).length;
原因是没有明确函数string
类型没有toFixed
属性`,那么怎么用函数重载解决这个报错问题呢?
我们可以可以根据传参的类型和函数返回值声明多个同名的函数,只是类型和返回值不同而已。
function arithmetic(x: number): number; function arithmetic(x: string): string; function arithmetic(x: number | string): number | string { if (typeof x === 'number') { return x; } else { return x+'是字符串'; } } arithmetic(1).toFixed(1);
这样就不会报错啦,因为已经识别到arithmetic(1)
的返回值是number
类型。
JS中函数重载怎么实现呢?
var arr = [1,2,3,4,5]; //注意:这里不能写成箭头函数,否则this指向的是window对象 Array.prototype.search = function() { var len = arguments.length; switch(len){ case 0: return this; case 1: return `${arguments[0]}`; case 2: return `${arguments[0]},${arguments[1]}`; } } console.log(arr.search()) //[1,2,3,4,5] console.log(arr.search(1)) //1 console.log(arr.search(1,2)) //1,2
![]()
function addMethod (obj, name, fn) { var old = obj[name]; obj[name] = function () { if (fn.length === arguments.length) { return fn.apply(this, arguments) } else if (typeof old === 'function') { return old.apply(this, arguments) } } } var person = {name: 'zhangsan'} addMethod(person, 'getName', function () { console.log(this.name + '---->' + 'getName1') }) addMethod(person, 'getName', function (str) { console.log(this.name + '---->' + str) }) addMethod(person, 'getName', function (a, b) { console.log(this.name + '---->' + (a + b)) }) person.getName() person.getName('zhangsan') person.getName(10, 20)
来源:csdn 蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~ 希望得到建议咨询、商务合作,也请与我们联系01063334945。 分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。 蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
UX/UI设计师在日常工作中是否遇到以下疑问:
- 方案由业务、产品主导,设计师没有发挥空间怎么办?
- 如何从设计视角出发梳理体验优化建议?
- 如何向各方证明你的优化建议是有价值的?
要回答以上问题,首先得理解设计价值究竟为何。
设计≠艺术,设计从诞生之初就是为“解决问题”而存在。
在体验设计场景,如果业务方是“需求提出者”,那产品经理和设计师就是从不同视角切入的“问题解决者”,而用户既是“需求源头”,又是“方案验证者”和最终“价值创造者”。
下面详细解读【设计价值】与【业务/用户/产品】三方的关系:
商业设计本质上服务于业务,因此判断设计价值几何的关键是:是否真正地帮助业务解决问题,助力业务目标达成。换而言之,设计价值就是设计师通过设计思维/策略/方法,直接或间接帮助业务创造的那部分价值。
设计不能脱离业务自嗨,不能“为了强调存在而存在”。 有效设计在于对业务诉求的精准满足。我们构思设计方案时,脑海中始终要回答:
- 实现了哪些业务目标
- 解决了哪些业务问题
- 创造了哪些业务价值
业务价值最直接的来源是用户价值的变现,因此,想要实现业务价值≈要服务好用户,这为设计价值的实现提供了有效抓手:设计师可以通过洞察用户需求,完善产品功能、优化操作体验的方式助力业务目标达成。
P.S.用户价值=产品给目标用户带来的核心价值,即:帮助用户解决了什么问题,满足了什么需求,提供了什么服务。
对于资深设计师来说,产品PRD不一定是最优解,它更像是提供了解决问题的第二参考视角,产品侧在理解业务目标的基础之上,从实现角度产出了初步解决方案,为设计师打开思路。
不同阶段设计师在面对同一份PRD时,有如下处理方式:
- 初级:不知其然,表象复刻——直接按照PRD方案输出相应设计;
- 中级:知其然,表象完善——对PRD方案进行查漏补缺,提出体验层优化建议;
- 高级:知其所以然,透过表象看本质——综合业务/产品目标,挖掘用户原始需求,提出当下最优解。
当设计师拿到 BRD & PRD 后,如何综合多维视角制定设计目标和策略?下面列举了笔者在日常工作中重点关注的维度。
业务会从商业角度提供清晰定义产品边界和价值变现模型,从BRD中可以提取以下重点信息:
- 产品/需求的目标用户类型和特定场景范围;
- 给用户带来的核心价值(帮助用户解决了什么问题/满足了什么诉求);
- 用户价值变现模型和策略(如何通过满足诉求进而实现用户价值变现);
- 业务价值可量化指标
我们需要注意一下两点:
- 关注北极星指标,比如某些场景侧重“留存”,有些侧重“转化”,这会影响设计侧重;
- 在产品发展初期,了解业务线未来的布局和规划,可以帮助我们把握设阶段性计节奏。
用户是一切需求的源头,仅从业务视角出发定义需求是无本之木。因此当设计师碰到业务需求不明确,或者对产品方案存疑时,最好的办法就是回归用户视角。用户需求挖掘一方面可以丰富和完善业务目标,另一方面也帮助我们审视当前业务需求是否与用户诉求吻合。通过用户分析我们可以得到:
- 目标用户特征;
- 典型场景下核心诉求、任务和关键行为;
- 关键行为可量化指标
P.S.为了挖掘多维度用户诉求,我们可以根据具体场景将用户细分,如:
- 角色:如B端/C端;
- 熟悉程度:小白/普通/专家;
- 客户价值:高价值/一般价值;
- 兴趣/偏好:价格敏感/XX控;
- 目标强弱:强目标/半目标/无目标;
- 阶段:获取-激活-留存-收益-推荐;
- 流程:开始前/进行中/结束后...
在业务主导的场景下,产品经理往往是需求的“第一经手人”,我们需要在PRD中捕捉到产品对业务需求的理解和转化策略。另外,产品视角也阐释了在落地实现层面的约束限制,特别是前台与中/后台的依赖关系。从 PRD 中可以获取以下重点信息:
- 产品目标和策略;
- 功能范围和核心流程;
- 中后台能力支持;
- 实现成本和风险点;
我们需要注意一下两点:
多数情况下,我们接到的需求是点状的,可能是某个子模块的子流程/功能,此时我们可以用更系统的视角向上追溯,定位模块所属能力矩阵,找到模块与模块之间的联系,这有利于精准把握需求,保证链路场景闭环,为后续由点到面驱动更大层面体验优化作准备;
很多功能不是“不该做”,而是当下“做不了”或“性价比低”,一些优化方案提出前,我们需要从产品角度考虑现有中后台能力支持、研发可行性、运营人力成本等,避免设计“空中楼阁”。
综合以上业务、用户和产品三个维度,我们更加精准推导设计目标。需要注意的是,设计不是万能的,大多情况下设计只能通过“影响/实现局部用户价值”间接助力变现,我们只需关注可以通过设计手段参与、干预和落实的部分即可。一个设计目标的完整表述 = 通过【XX设计策略】帮助目标用户【实现XX价值/满足XX需求/解决XX问题】,以助力【XX业务目标/变现方式】达成。(在实际表达中可以适当精简)
确立明确的设计目标和策略后,下面进入设计实施和验证阶段,这里推荐两个基础的推导模型。
SKS模型,即策略(Strategy) → 影响因子(Key factor) → 解决方案(Solution)。设计目标中的策略是一切方案推导的源头,我们需要找到影响策略实现程度和效果的关键因素,将其视为可控变量,并以这些变量为切入点进行方案尝试,最终衍生多种解法。
比如:我们把提升Banner的点击率作为策略,那影响banner点击的影响因素可能是:形式是否新颖、配色是否亮眼、是否有动效引导、利益点是否突出、行动按钮是否吸引人点击等等,每一个影响因子都可以衍生出多种设计方案。
上文提到,设计手段通常是以间接方式助力用户价值实现,进而赋能业务目标达成。那如何量化设计价值呢?我们可以使用“GAM模型”,即设计目标(Goal) → 高价值行为(Action) → 衡量指标(Metric)。具体方法如下:
一个设计目标实现,一定是由链路中一个/多个高价值行为促成。比如用户在真正“下单”前,会访问商品详情页,浏览商品详情页信息,加购物车等。
用数据刻画和度量高价值行为的指标变化,进而度量设计方案的价值用数据刻画和度量高价值行为的指标变化,进而度量设计方案的价值。 我们可以尽量多维度拆解高价值行为和相应度量指标,维度越多,关联性越高,判断误差越小。
事有轻重缓急,不是所有的需求都需要走上述方法进行设计分析,要学会辨别重点的、有发展潜力的需求投入更多设计精力深入研究。后续笔者将通过具体的设计项目,详细阐述如何运用业务×产品×用户三重视角,推导改版目标和设计策略,敬请期待《「②实战篇」如何提升设计价值——2022京东APP频道广场V2.0改版探索》。
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
本章的内容围绕“人”这个中心,分成了两个要点:
1.人是服务的核心
2.洞见与数字
在人是服务核心这里,简而言之就是首先用户体验是至关重要的,单体产品并不能代表设计本身。
这个要点并没有什么新意,大家都知道用户中心设计思维在设计中的地位。而其实,真正“人是核心”想说是设计师要注意多个方面的参与者。
这里我给出一个例子,比如在中国非常火热的外卖系统,虽然我们会认为典型的user是点外卖的人,但实际上商家、外卖小哥甚至平台自身的客服人员都是服务设计所需要关注的“人”,但需要关注的理由各异,后续会讲到。
洞见与数字,在英文原书中用的词是 Insights versus Numbers,注意是 versus 而不是 and, 也就是说原作者的意思是 insight 和 number 是存在一些对立和取舍的。
图片出处:Rosenfeld Media 图片授权:Attribution 2.0 Generic (CC BY 2.0)
如这张图所示:作者认为和传统的用户研究手段获得多个有用的可量化的 facts/truths 不同,服务设计的洞见需要的不是更多的 truth, 而是更深入但却不可量化的 insights.
所以,与其得到更多的 numbers 不如更深入的获得 insights. 由于第四章会对insight和获得insight的过程进行详细展开,这里我就不过多展开了。
除了上述两个要点外,有个小点值得放大一下,中文版书中有个小标题叫“共同设计,而不是单方面只为客户设计”,英文原版叫做“design with people, not for them”.
我们也能够看出原书作者又一次强调了服务设计的共创属性,当然这个共创属性也是第二章中作者阐述过的内容,再结合本章第一点中对“人”的定义,那么共创的对象就应该是更多的参与者而不仅仅是用户了。
作者在原书中明确说设计师要和一线接触用户客户的员工进行共创,因为他们洞见更加深入,更有价值。
首先大家都是做设计的,前期调研的事情一定没少做过,往往我们习惯了用饼图柱状图条状图等内容来表达自己的调研结果(事实上是调查结果,因为研究是基于调查结果的,真正的研究并没有开始)。
但在服务设计领域中,获得结果导向的数据往往意义不太大,我们需要的是基于洞察的共情,以及基于共情的用户体验确认,毕竟我们无法用简单粗暴的诸如1升汽油或者60°C的热水一样,用一个可量化的量词来规范人的情感。
正是因此,与传统UCD类似直男般 fact-problem-needs 的思维逻辑不通,服务设计需要我们设计师走入 洞察-共情-需求 insight-empahize-needs 这样的路径。
其次,作者强调的是“人/people”,而非“user”,这个细节非常重要。
试想这个例子,比如这里有片广场,有一群活力四射的阿姨在跳广场舞,那么我们应该关注的是谁呢?是广场舞阿姨吗?
是,但不只是。因为,广场上还有其他的诸如看跳广场舞的大叔、玩耍的孩子、路过的市民甚至周边离得近的居民等,他们显然都是这里的people而很难剥离出一个人群我们称他们为user. 如果我们要做广场的优化设计,那么所有人都应该是我们关注的对象和共创的对象。
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
蓝蓝设计的小编 http://www.lanlanwork.com