(给达达前端加星标,提升前端技能)
不用怕
https://v.qq.com/x/cover/mzc002004ceupu5/y3058p0xcr6.html
内容有点多,也请你静下来,慢阅读,今后多多关照。
Vue框架基础知识
mvx模式介绍,x这里代表是未知数的意思,那么有多少mvx模式要我们了解的呢?mvc模式,mvvm模式,相互之间的区别。
让我们说一说mvc模式,这模式很常见,mvc模式,mvc模式是移动最广泛的软件架构之一,把应用程序分为三部分,分别为模型,Model,视图view,以及控制器controller。
现在的我们常说的是Mvvm模式,这也是面试官会问,什么是Mvvm模式的呢,mvvm模式是把mvc模式的controller改成viewmodel。
view的变化会自动更新viewmodel,viewmodel的变化也会自动同步到view上显示。
web前端开发阶段,原生代码开发阶段,使用HTML,css,JavaScript代码进行前端开发,学习web原生的优点,就是学习成本低,容易上手,不好的就是代码结构混乱,代码冗余,浏览器兼容性不成熟,不利于分工合作。
代码库开发的阶段,就是使用成熟的开源扩展库进行前端的开发,优点就是开发快速,浏览器兼容性良好,缺点就是视图层和数据层混合在一起,不利于团队分工合作。
框架开发阶段,采用前端mvc模式或者是Mvvm模式开发,优点就是代码分层,便于团队合作,便于后续代码维护,缺点就是学习成本高,框架更新迭代快。
vue框架的学习,vue是一套构建用户界面的渐进式框架,vue只关注图层,采用自底向上增量开发的设计。
模板 |
主要内容 |
Vue基础知识 |
Vue框架基础语法、Vue开发工具 |
Vue组件 |
Vue组件、Vue模块化开发 |
Vue工程化开发 |
npm/yarn和webpack开发工具、Vue-cli开发工具、单文件工具 |
Node.js基础和Axios网络请求 |
Node.js构建Web服务器、Axios发送ajax请求、postman网络调试工具 |
Vue-Router路由 |
单页面应用SPA、Vue-Router实现路由机制 |
Vuex状态管理 |
Vuex状态管理、本地存储 |
Vue-UI库 |
Vue中的UI库 |
三大框架的对比
Angular |
React |
Vue |
|
发布时间 |
2009年 |
2013年 |
2014年 |
维护者 |
谷歌 |
尤雨溪 |
|
视图引擎 |
HTML |
JSX |
HTML |
学习曲线 |
陡峭 |
较复杂 |
简单 |
大小 |
500K+ |
130K+ |
50K+ |
功能复杂度 |
完善 |
完善 |
简单 |
文档 |
英文 |
英文 |
中文 |
应用场景 |
大型复杂应用 |
中大型应用、移动跨平台开发 |
中小型轻量级应用 |
如何使用我们的vue.js框架
安装,在vue.js的官网上下载vue.min.js并用script标签引入,cdn方式引入vue.js文件,vue推荐使用地址。
第一个vue项目实例
实例对象
vue实例对象就是vue框架的一个核心。
配置项el,把vue实例挂载到dom元素上,然后通过id绑定到html元素;配置项data,就是数据对象,vue实例的数据,注意了,数据不要与methods中的方法重名;配置项methods,事件对象,包含事件所有触发的函数,注意了,方法名不要与data中的数据重名了;配置项computed,计算属性;配置项watch,表示监听器;配置项directives,表示自定义指令。
配置项钩子(hook)函数,hook(钩子)函数,不同生命周期引发的动作,路由钩子函数,路由组件在不同状态时触发。
components表示组件容器;配置项template,定义模板,可以是字符串,也可以是“#”选择器,props配置项,用于接收父组件的数据;router配置项,路由,store配置项,vuex状态。
属性 |
说明 |
vm.$el |
Vue 实例使用的根 DOM 元素 |
vm.$data |
Vue的data配置项 |
vm.$options |
用于当前 Vue 实例的初始化选项 |
vm.$props |
当前组件接收到的 props 对象 |
vm.$parent |
父实例(如果当前实例有的话) |
vm.$root |
当前组件树的根 Vue 实例 |
vm.$children |
当前实例的直接子组件 |
vm.$refs |
原生DOM元素或子组件注册引用信息 |
vm.$slots |
用来访问被插槽分发的内容 |
vm.$router |
全局路由(vue-router插件) |
vm.$store |
vuex 状态对象(vuex插件) |
方法 |
说明 |
vm.$emit() |
子组件可以使用 $emit 触发父组件的自定义事件 |
vm.$set() |
Vue.set的别名<br /> 设置对象的属性, 这个方法主要用于避开 Vue 不能检测属性被添加的限制 |
vm.$watch |
侦听数据变化 |
vm.$on() |
监听当前实例上的自定义事件。事件可以由vm.$emit触发。回调函数会接收所有传入事件触发函数的额外参数。 |
vm.$mount |
可以使用 vm.$mount() 手动挂载(Vue 实例化时没有 el 选项) |
vm.$destroy |
完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令及事件监听器。<br /> 触发 beforeDestroy 和 destroyed 的钩子。 |
属性绑定指令 |
说明 |
v-bind |
动态改变dom标签上的属性<br />v-bind :class="" 简写 :class="" |
生命周期,vue实例从开始创建,初始化数据,编译模板,挂载dom,渲染到更新到渲染,到卸载等一系列过程。
总结一下,四个阶段,创建,挂载,更新,销毁。
使用New Vue()来创建vue实例;接下是beforeCreate调用beforeCreate生命周期钩子,observe data开始监控data对象数据变化,init events,vue初始化内部事件,created调用created生命周期钩子,has"el"option?实例中是否含有"el"选项,有调用vm.$mount手动挂载一个未挂载的实例时,has "template" option?是否含有template选项。
模板语法
计算属性
计算属性,顾名思义就是通过其他变量计算得来的另一个属性。
计算属性具有缓存,多次访问计算属性会立即返回之前的计算结果,而不是再次计算后的结果。
computed中的函数,不能传参。
methods方法
vue对象中可以使用methods属性,用来编写自定义函数,使用方法是methods属性由一系列json方法对组成。
渲染
循环数组:
循环对象
数组的更新检查
push(),pop(),shift(),unshift(),splice(),sort(),reverse()为变异方法可触发视图更新。
filter(),concat(),slice()为非变异方法,不触发视图更新,他们可以返回新数组,用新数组替换旧数组,就可以刷新视图。
条件渲染
指令 |
说明 |
v-if |
根据其后表达式的bool值进行判断是否渲染该元素 |
v-else-if |
v-if 的“else-if 块”,可以连续使用 |
v-else |
表示 v-if 的“else 块”<br />v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。 |
事件与表单
事件处理,需要绑定事件处理函数,在Vue中绑定事件处理,直接在HTML元素上使用v-on指令绑定即可。
指令 |
说明 |
v-on:click |
简写: @click=""click、mouseover、mouseout、mouseup、mousedown、dblclick 、contextmenu、keydown、keyup等 |
事件对象,事件处理过程中会触发event事件对象,这个event对象代表当前事件的状态,比如事件触发时的HTML元素是什么,event.target来得到触发事件的HTML元素,可以得到事件的类型。
event.type得到当前的事件类型。
属性和方法 |
描述 |
event.type |
触发的事件类型 |
event.target |
触发事件的HTML元素 |
event.preventDefault( ) |
阻止事件的默认行为 |
event.stopPropagation( ) |
阻止事件冒泡 |
借助事件对象实现一个事件委托机制,从而提高我们应用程序的一个性能,什么是事件委托机制?事件委托机制在列表渲染过程中,大部分都是v-for渲染过程中,借助event事件对象,在父元素之上绑定事件处理函数而不是在子元素之上绑定事件处理函数。
表单处理
指令 |
说明 |
v-model |
双向数据绑定支持标签:<input> <textarea> <select> |
表单事件 |
触发控件 |
说明 |
focus |
input框、textarea框 |
输入框获取到输入焦点 |
blur |
input框、textarea框 |
输入框失去焦点 |
click |
单选框、多选框 |
选中某一个单选项或复选框 |
change |
下拉列表 |
切换下拉列表项 |
submit |
提交按钮 |
单击提交按钮 |
vue组件,组件是vue.js的功能之一,目的是为了可重用性高,减少重复性的开发,在结构上相近或相同的代码进行封装,成为一个高度可复用的部件称为组件。
选项 |
说明 |
模板(template) |
模板声明了数据和最终展现给用户的DOM之间的映射关系。 |
初始数据(data) |
一个组件的初始数据状态。对于可以复用的组件来说,通常是私有的状态。 |
接受的外部参数(props) |
组件之间通过参数来进行数据的传递和共享。参数默认是单向绑定(由下往上),但也可以显示声明为双向绑定。 |
方法(methods) |
对数据的改动操作一般都在组件的方法内进行。可以通过v-on指令将用户输入事件和组件方法进行绑定。 |
生命周期钩子函数(lifecycle hooks) |
一个组件会触发多个生命周期钩子函数,比如created、attached、destroyed等。在这些钩子函数中,我们可以封装一些自定义的逻辑。和传统的MVC相比,这可以理解为Controller的逻辑被分散到了这些钩子函数中。 |
vue组件的使用,先注册后使用,vue组件可以在全局注册,也可以在局部注册。
创建组件
注册组件,使用组件,注意事项
注意事项
模板:使用id绑定
命名:组件名不要是html标准标签名,如果用驼峰定义,html中引用组件时,改为短横线命名
data属性表名vue组件可用的响应式数据,是vue实例的数据对象;vue将会递归data的属性转变为getter/setter,让data的属性能够响应数据变化,对象必须是纯粹的对象,浏览器api创建的原生对象,原型上的属性会被忽略。
data访问原始数据对象,Vue实例代理了data对象上所有的属性。
props传递数据,父组件和子组件之间的数据通信。
事件通信
父组件和子组件之间的数据操作,是通过Props属性和$emit()方法来实现的
props,声明位置在子组件中声明,属性值,在组件模板中绑定。
$emit,子组件向父组件传值,使用$emit触发父组件方法。
注意,props属性名如果用驼峰定义,html标签中改为短横线命名,$emit自定义事件不能使用驼峰,短横线命名。
如果prop是一个对象或数组,子组件内部改变它会影响父组件的状态。
非父子通信
本质上通过派发事件-》监听事件从而更改值。
组件类型
动态组件,主要是在使用过程中,可能需要动态的切换组件的显示内容。
多个组件主要是使用同一个挂载点。
递归组件,在组件内部可以嵌套调用其他组件,甚至可以递归地调用当前自身组件。
vue工程化工具
node.js是一个让JavaScript运行在服务端的开发平台,它让JavaScript成为和PHP,python,perl,ruby等服务器端语言平起平坐的脚本语言。node.js是一个基于chrome JavaScript运行时建立的平台,用于方便地搭建响应速度快,易于扩展的网络应用,node.js使用hijack驱动,非阻塞i/o模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
node.js使用module模块去划分不同的功能,以简化应用的开发。
引入了Http类库,并且对http类库的引用存放在http变量中。
Node.js环境安装
https://nodejs.org/en/download/
升级npm版本
属性 |
说明 |
name |
包名 |
version |
包的版本号。 |
description |
包的描述。 |
homepage |
包的官网 url 。 |
author |
包的作者姓名。 |
contributors |
包的其他贡献者姓名。 |
dependencies |
依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。 |
repository |
包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。 |
main |
字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。 |
kewords |
关键字 |
命令 |
说明 |
npm help |
可查看某条命令的详细帮助,例如npm help install。 |
npm install <package>e -g |
在本地安装当前命令行程序,可用于发布前的本地测试。 |
npm update <package> -g |
使用可以把全局安装的对应命令行程序更新至最新版。 |
npm update <package> |
可以把当前node_modules子目录里对应模块更新至最新版本 |
npm cache clear |
可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人 |
npm unpublish <package>@<version> |
可以撤销发布自己发布过的某个版本代码。 |
yarn使用
Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。
它的出现是为了解决使用npm面临的问题:
yarm命令
指令 |
说明 |
yarn init |
初始化项目,生成package.json文件 |
yarn add 包名 |
添加依赖包,示例:yarn add [package]、yarn add [package]@[version]、yarn add [package]@[tag] |
yarn |
根据 package.json 安装全部依赖包,也可以使用 yarn install |
yarn upgrade |
升级依赖包 |
yarn remove |
移除依赖包 |
Npm |
Yarn |
说明 |
npm init |
yarn init |
初始化某个项目 |
npm install/link |
yarn install/link |
默认的安装依赖操作 |
npm install taco -save |
yarn add taco |
安装某个依赖,并默认保存到package |
npm uninstall taco -save |
yarn remove taco |
移除某个依赖项目 |
npm install taco –save-dev |
yarn add taco –dev |
安装某个开发时依赖项目 |
npm updata taco -save |
yarn upgrade taco |
更新某个依赖项目 |
npm install taco --global |
yarn global add taco |
安装某个全局依赖项目 |
npm publish/login/logout |
yarn publish/login/logout |
发布、登录、登出,一系列NPM Registry操作 |
npm run test |
yarn run test |
运行某个命令,可以在script脚本中去配置 |
vue cli是一个基于vue.jsf进行快速开发的完整系统。
文件 |
说明 |
build |
项目构建(webpack)相关代码 |
config |
配置目录,包括端口号等。我们初学可以使用默认的。 |
node_modules |
npm 加载的项目依赖模块 |
src |
这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件: ² assets: 放置一些图片,如logo等 ² components: 目录里面放了一个组件文件,可以不用 ² App.vue: 项目入口文件,我们也可以直接将组件写这里,而不使用 components 目录 ² main.js: 项目的核心文件 |
test |
初始测试目录,可删除 |
static |
静态资源目录,如图片、字体等。 |
index.html |
首页入口文件,你可以添加一些 meta 信息或统计代码啥的 |
package.json |
项目配置文件。 |
README.md |
项目的说明文档,markdown 格式 |
vue项目配置
配置项 |
数据类型 |
说明 |
默认值 |
publicPath |
string |
基本路径 |
'/' |
outputDir |
string |
输出文件目录 |
'dist' |
assetsDir |
string |
静态资源存放目录 |
' ' |
indexPath |
string |
输出路径 |
'index.html' |
filenameHashing |
Boolean |
生成的静态资源在它们的文件名中包含了hash 以便更好的控制缓存 |
true |
pages |
Object |
在 multi-page 模式下构建应用。每个“page”应该有一个对应的 JavaScript 入口文件。 |
undefined |
lintOnSave |
Boolean |
是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码。 |
true |
runtimeCompiler |
Boolean |
是否使用包含运行时编译器的 Vue 构建版本 |
false |
transpileDependencies |
Boolean |
是否生成source map文件,可以将其设置为 false 以加速生产环境构建。 |
true |
crossorigin |
String |
设置生成的 HTML 中<link rel="stylesheet">和<script> 标签的 crossorigin 属性(跨域)。 |
undefined |
integrity |
Boolean |
在生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标签上启用 Subresource Integrity(SRI:摘要签名机制,来保证外链资源的完整性)。 |
flase |
configureWebpack |
Object/function |
Object:通过 webpack-merge合并到最终的配置中<br />function:接收被解析的配置作为参数 |
|
chainWebpack |
Function |
用来表示是一个函数,会接收一个基于<br/>webpack-chain 的 ChainableConfig 实例。允许对内部的 webpack 配置进行更细粒度的修改。 |
|
css.modules |
Boolean |
默认情况下,只有 .module.[ext] 结尾的文件才会被视作 CSS Modules 模块。设置为true后你就可以去掉文件名中的.module并将所有\.(css|scss|less|styel(us)?)文件视为CSS Modules文件。 |
false |
css.extract |
Boolean/Object |
用来设置是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。 |
生产环境:true<br />开发环境:fals。 |
css.sourceMap |
Boolean |
是否为 CSS 开启 source map。 |
false |
css.loaderOptios |
Object |
用来向 CSS 相关的 loader 传递选项 |
{} |
devServer |
Object |
所有 webpack-dev-server 的选项都支持 |
|
devServer.proxy |
String/Object |
前端应用和后端 API 服务器没有运行在同一个主机上,需要在开发环境下将 API 请求代理到 API 服务器。 |
proxy: '' |
parallel |
Boolean |
是否为Babel或 TypeScript 使用 thread-loader。该选项在系统的 CPU 有多于一个内核时自动启用,仅用于生产构建。 |
require('os').cpus().length > 1 |
pluginOptions |
Object |
用来传递任何第三方插件选项。 |
js模块
express服务器开发
Node.js是运行在服务器端的JavaScript。
第一个node应用程序
express
body-parser,node.js中间件,用于处理json,raw,text和url编码的数据。cookie-parser是一个解析cookie的工具,通过req.cookies可以取到传过来的cookie,并把它们转成对象。multer,node.js中间件,用于处理表单数据。
属性 |
说明 |
req.app |
callback为外部文件时,用req.app访问Express的实例 |
req.baseUrl |
获取路由当前安装的URL路径 |
req.body / req.cookies |
获得「请求主体」/ Cookies |
req.fresh / req.stale |
判断请求是否还「新鲜」 |
req.hostname / req.ip |
获取主机名和IP地址 |
req.originalUrl |
获取原始请求URL |
req.params |
获取路由的parameters |
req.path |
获取请求路径 |
req.protocol |
获取协议类型 |
req.query |
获取URL的查询参数串 |
req.route |
获取当前匹配的路由 |
req.subdomains |
获取子域名 |
req.accepts() |
检查可接受的请求的文档类型 |
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages |
返回指定字符集的第一个可接受字符编码 |
req.get() |
获取指定的HTTP请求头 |
req.is() |
判断请求头Content-Type的MIME类型 |
属性 |
说明 |
res.app |
同req.app一样 |
res.append() |
追加指定HTTP头 |
res.set() |
在res.append()后将重置之前设置的头 |
res.cookie(name,value [,option]) |
设置Cookie |
opition |
domain / expires / httpOnly / maxAge / path / secure / signed |
res.clearCookie() |
清除Cookie |
res.download() |
传送指定路径的文件 |
res.get() |
返回指定的HTTP头 |
res.json() |
传送JSON响应 |
res.jsonp() |
传送JSONP响应 |
res.location() |
只设置响应的Location HTTP头,不设置状态码 或者close response |
res.redirect() |
设置响应的Location HTTP头,并且设置状态码302 |
res.render(view,[locals],callback) |
渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。 |
res.send() |
传送HTTP响应 |
res.sendFile(path [,options] [,fn]) |
传送指定路径的文件 -会自动根据文件extension设定Content-Type |
res.status() |
设置HTTP状态码 |
res.type() |
设置Content-Type的MIME类型 |
express路由
请求方法 |
说明 |
GET |
请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据. |
HEAD |
请求一个与GET请求的响应相同的响应,但没有响应体. |
POST |
用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的更改. |
PUT |
用请求有效载荷替换目标资源的所有当前表示。 |
DELETE |
删除指定的资源。 |
CONNECT |
建立一个到由目标资源标识的服务器的隧道。 |
OPTIONS |
用于描述目标资源的通信选项。 |
TRACE |
沿着到目标资源的路径执行一个消息环回测试。 |
PATCH |
用于对资源应用部分修改。 |
pug视图模板
Cookie |
Session |
Cookie是把用户的数据写给用户的浏览器,在浏览器端保存状态数据,每次访问服务器时,在HTTP请求消息中传输状态数据。缺点是:数据量太大,HTTP消息传输负担较大;用户可能会修改cookie信息,导致服务器不安全。 |
Session技术把用户的数据写到用户独占的session中,不同用户通过不同的sessionid 辨别。 <br />1.把 sessionid 保存在 客户端cookie或本地存储中。 <br /> 2.浏览器发送HTTP请求时,附带 sessionid 的cookie信息,以便服务器端区分是哪一个用户。 Session技术把用户的数据写到用户独占的session中,不同用户通过不同的sessionid 辨别。 |
参数 |
作用 |
Secret |
一个String类型的字符串,作为服务器端创建session的签名 |
Name |
返回客户端key的名称,默认为connect.sid,也可以自己设置 |
Resave |
强制保存session,即使它没有变化。默认为true。建议设置成false。 |
SaveUninitialized |
强制将未初始化的session存储。当新建了一个session且未设定属性或值时,它就处于未初始化状态。在设定一个cookie前,这对于登录验证,减轻服务的存储压力,极限控制是有帮助的(默认为true)。建议手动添加。 |
Cookie |
设置返回到前端key的属性,默认值为{path: '/', httpOnly: true, secure: false, maxAge: null}。 |
Rolling |
在每次请求时强行设置cookie,这将重置cookie过期时间,默认是false。 |
目录/文件 |
说明 |
build |
项目构建(webpack)相关代码 |
config |
配置目录,包括端口号等。我们初学可以使用默认的。 |
node_modules |
npm 加载的项目依赖模块 |
src |
这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件: 1.sets: 放置一些图片,如logo等。 2.mponents: 目录里面放了一个组件文件,可以不用。 3.p.vue: 项目入口文件,我们也可以直接将组件写这里,而不使用 components 目录。 4.in.js: 项目的核心文件。 |
static |
静态资源目录,如图片、字体等。 |
test |
初始测试目录,可删除 |
.xxxx文件 |
这些是一些配置文件,包括语法配置,git配置等。 |
index.html |
首页入口文件,你可以添加一些 meta 信息或统计代码啥的。 |
package.json |
项目配置文件。 |
README.md |
项目的说明文档,markdown 格式。 |
指令 |
说明 |
nodemon -h或者 nodemon --help |
使用帮助 |
nodemon -e |
默认的 nodemon监视 .js, .mjs, .coffee, litcoffee和Json文件,通过-e命令你可以指定你自己的查找列表 |
nodemon --watch path |
nodemon默认只会监视当前的工作路径,如果你想去监视其他路径上的文件,你可以使用如下命令: nodemon --watch app --watch libs app/server.js |
nodemon --ignore |
忽视一些文件被监视 |
nodemon --delay |
有时候你会修改许多文件,这时为了避免不必要的重启,你可以通过命令指定多少时间后再进行重启。 nodemon --delay 10 server.js |
rs |
手动重启 |
nodemon ./server.js localhost 8080 |
指定主机和端口 |
nodemon --debug ./server.js 80 |
开启debug模式 |
UI框架 |
开发团队 |
github star数 |
优缺点 |
element ui(桌面版ui) |
饿了么团队开源的ui库 |
34K |
组件丰富,但是界面样式不太美观。 http://element-cn.eleme.io/#/zh-CN/component/installation |
iView(桌面版ui) |
个人团队开源的ui库 |
19K |
组件丰富,界面样式美观,但使用 render 函数渲染,使用成本较高。 https://www.iviewui.com/docs/guide/install |
Vux(移动端ui) |
基于微信ui推出的移动端ui库 |
14.9K |
https://doc.vux.li/zh-CN/ |
mint-ui(移动端ui) |
饿了么团队推出的移动端ui库 |
13.2K |
http://mint-ui.github.io/docs/#/zh-cn2 |
陪伴你的365天
今后也请你多多关照
推荐阅读 点击标题可跳转
【面试Vue全家桶】vue前端交互模式-es7的语法结构?async/await
【面试需要】掌握JavaScript中的this,call,apply的原理
2019年的每一天日更只为等待她的出现,好好过余生,庆余年 | 掘金年度征文
觉得本文对你有帮助?请分享给更多人
关注「达达前端」加星标,提升前端技能
在博客平台里,未来的路还很长,也希望自己以后的文章大家能多多支持,多多批评指正,我们一起进步,一起走花路。
非常感谢读者能看到这里,如果这个文章写得还不错,觉得「达达」我有点东西的话,觉得我能够坚持的学习,觉得此人可以交朋友的话, 求点赞,求关注,求分享,对暖男我来说真的
非常有用!!!
感谢阅读,原创不易,喜欢就点个[在看] or [转发朋友圈],这是我写作最大的动力。
意见反馈
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。
这是一个有质量,有态度的公众号
点关注,有好运
转载:https://blog.csdn.net/qq_36232611/article/details/104104018