在本教程中,我将向大家展示如何使用 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咨询、用户体验公司、软件界面设计公司
出现这个错误是因为 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咨询、用户体验公司、软件界面设计公司
目录
1、基本介绍
▶ 概述
Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。
我们之前也学习过后端的框架 `Mybatis` ,`Mybatis` 是用来简化 `jdbc` 代码编写的;而 `VUE` 是前端的框架,是用来简化 `JavaScript` 代码编写的。前面的综合性案例,里面进行了大量的DOM操作,如下
![]()
使用 `VUE` 后,这部分代码我们就不需要再写了。那么 `VUE` 是如何简化 DOM 书写呢?基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。之前我们是将关注点放在了 DOM 操作上;而要了解 `MVVM` 思想,必须先了解 `MVC` 思想,如下图就是 `MVC` 思想图解
![]()
其中的C 就是咱们 js 代码,M 就是数据,而 V 是页面上展示的内容,如下图:
![]()
`MVC` 思想是没法进行双向绑定的。双向绑定是指当数据模型数据发生变化时,页面展示的会随之发生变化,而如果表单数据发生变化,绑定的模型数据也随之发生变化。接下来了解`MVVM` 思想,如下图是三个组件图解:
![]()
图中的 `Model` 就是我们的数据,`View` 是视图,也就是页面标签,用户可以通过浏览器看到的内容;`Model` 和 `View` 是通过 `ViewModel` 对象进行双向绑定的,而 `ViewModel` 对象是 `Vue` 提供的。双向绑定的效果:下图是提前准备的代码写出来的,输入框绑定了 `username` 模型数据,而在页面上也使用 `{{}}` 绑定了 `username` 模型数据
![]()
通过浏览器打开该页面可以看到如下页面
![]()
当我们在输入框中输入内容,而输入框后面随之实时的展示我们输入的内容,这就是双向绑定的效果。
▶ 快速入门
Vue 使用起来是比较简单的,总共分为如下三步:
1. 新建 HTML 页面,引入 Vue.js文件
<script src="js/vue.js"></scrip>2. 在JS代码区域,创建Vue核心对象,进行数据绑定
new Vue({ el: "#app", data() { return { username: "" } } });创建 Vue 对象时,需要传递一个 js 对象,而该对象中需要如下属性:
● `el` : 用来指定哪个地方的标签受 Vue 管理。 该属性取值 `#app` 中的 `app` 需要是受管理的标签的id属性值
● `data` :用来定义数据模型
● `methods` :用来定义函数。这个我们在后面就会用到3. 编写视图
<div id="app"> <input name="username" v-model="username" > {{username}} </div>`{{}}` 是 Vue 中定义的 `插值表达式` ,在里面写数据模型,到时候会将该模型的数据值展示在这个位置。
▷ 整体代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <input v-model="username"> <!--插值表达式--> {{username}} </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ // data() 是 ECMAScript 6 版本的新的写法 return { username:"" } } /*data: function () { return { username:"" } }*/ }); </script> </body> </html>![]()
2、Vue 指令
指令:HTML 标签上带有 v- 前缀的特殊属性,不同指令具有不同含义。例如:v-if,v-for…
![]()
▷ v-bind & v-model 指令
![]()
▷ v-bind
该指令可以给标签原有属性绑定模型数据。这样模型数据发生变化,标签属性值也随之发生变化,例如:
<a v-bind:href="url">百度一下</a>上面的 `v-bind:"` 可以简化写成 `:` ,如下:
<!-- v-bind 可以省略 --> <a :href="url">百度一下</a>▷ v-model
该指令可以给表单项标签绑定模型数据。这样就能实现双向绑定效果。例如:
<input name="username" v-model="username">▷ 代码演示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <a v-bind:href="url">点击一下</a> <a :href="url">点击一下</a> <input v-model="url"> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { username:"", url:"https://www.baidu.com" } } }); </script> </body> </html>![]()
通过浏览器打开上面页面,并且使用检查查看超链接的路径,该路径会根据输入框输入的路径变化而变化,这是因为超链接和输入框绑定的是同一个模型数据
![]()
▶ v-on 指令
![]()
我们在页面定义一个按钮,并给该按钮使用 `v-on` 指令绑定单击事件,html代码如下:
<input type="button" value="一个按钮" v-on:click="show()">而使用 `v-on` 时还可以使用简化的写法,将 `v-on:` 替换成 `@`,html代码如下
<input type="button" value="一个按钮" @click="show()">上面代码绑定的 `show()` 需要在 Vue 对象中的 `methods` 属性中定义出来
new Vue({ el: "#app", methods: { show(){ alert("我被点了"); } } });注意:`v-on:` 后面的事件名称是之前原生事件属性名去掉on。
例如:
● 单击事件 : 事件属性名是 onclick,而在vue中使用是 `v-on:click`
● 失去焦点事件:事件属性名是 onblur,而在vue中使用时 `v-on:blur`▷ 整体页面代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <input type="button" value="一个按钮" v-on:click="show()"><br> <input type="button" value="一个按钮" @click="show()"> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { username:"", } }, methods:{ show(){ alert("我被点了..."); } } }); </script> </body> </html>![]()
▶ 条件判断指令
![]()
接下来通过代码演示一下。在 Vue中定义一个 `count` 的数据模型,如下
//1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { count:3 } } });现在要实现,当 `count` 模型的数据是3时,在页面上展示 `div1` 内容;当 `count` 模型的数据是4时,在页面上展示 `div2` 内容;`count` 模型数据是其他值时,在页面上展示 `div3`。这里为了动态改变模型数据 `count` 的值,再定义一个输入框绑定 `count` 模型数据。html 代码如下:
<div id="app"> <div v-if="count == 3">div1</div> <div v-else-if="count == 4">div2</div> <div v-else>div3</div> <hr> <input v-model="count"> </div>▷ 整体页面代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <div v-if="count == 3">div1</div> <div v-else-if="count == 4">div2</div> <div v-else>div3</div> <hr> <input v-model="count"> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { count:3 } } }); </script> </body> </html>![]()
通过浏览器打开页面并在输入框输入不同的值,效果如下
![]()
然后我们在看看 `v-show` 指令的效果,如果模型数据 `count ` 的值是3时,展示 `div v-show` 内容,否则不展示,html页面代码如下
<div v-show="count == 3">div v-show</div> <br> <input v-model="count">浏览器打开效果如下:
![]()
通过上面的演示,发现 `v-show` 和 `v-if` 效果一样,那它们到底有什么区别呢?我们根据浏览器的检查功能查看源代码:
![]()
通过上图可以看出 `v-show` 不展示的原理是给对应的标签添加 `display` css属性,并将该属性值设置为 `none` ,这样就达到了隐藏的效果。而 `v-if` 指令是条件不满足时根本就不会渲染。
▶ v-for 指令
![]()
这个指令看到名字就知道是用来遍历的,该指令使用的格式如下:
<标签 v-for="变量名 in 集合模型数据"> {{变量名}} </标签>注意:需要循环那个标签,`v-for` 指令就写在那个标签上。
如果在页面需要使用到集合模型数据的索引,就需要使用如下格式:
<标签 v-for="(变量名,索引变量) in 集合模型数据"> <!--索引变量是从0开始,所以要表示序号的话,需要手动的加1--> {{索引变量 + 1}} {{变量名}} </标签>▷ 代码演示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <div v-for="addr in addrs"> {{addr}} <br> </div> <hr> <div v-for="(addr,i) in addrs"> {{i+1}}--{{addr}} <br> </div> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { addrs:["北京","上海","西安"] } } }); </script> </body> </html>![]()
通过浏览器打开效果如下
![]()
3、生命周期
生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法。
![]()
下图是 Vue 官网提供的从创建 Vue 到效果 Vue 对象的整个过程及各个阶段对应的钩子函数
![]()
看到上面的图,大家无需过多的关注这张图。这些钩子方法我们只关注 `mounted` 就行了。
`mounted`:挂载完成,Vue初始化成功,HTML页面渲染成功。而以后我们会在该方法中发送异步请求,加载数据。
1、基本介绍
▶ 概述
Element:是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页。
Element 提供了很多组件(组成网页的部件)供我们使用。例如 超链接、按钮、图片、表格等等~
如下图左边的是我们编写页面看到的按钮,上图右边的是 Element 提供的页面效果,效果一目了然。
![]()
我们学习 Element 其实就是学习怎么从官网拷贝组件到我们自己的页面并进行修改,官网网址是:元素 - 全球最受欢迎的 Vue UI 框架 (eleme.cn)
进入官网能看到如下页面
![]()
接下来直接点击 `组件` ,页面如下
![]()
2、Element 布局
Element 提供了两种布局方式,分别是:
● Layout 布局
● Container 布局容器▷ Layout 局部
通过基础的 24 分栏,迅速简便地创建布局。也就是默认将一行分为 24 栏,根据页面要求给每一列设置所占的栏数。
![]()
在左菜单栏找到 `Layout 布局` ,然后找到自己喜欢的按钮样式,点击 `显示代码` ,在下面就会展示出对应的代码,显示出的代码中有样式,有html标签。将样式拷贝我们自己页面的 `head` 标签内,将html标签拷贝到 `<div id="app"></div>` 标签内。
▷ 整体页面代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .el-row { margin-bottom: 20px; } .el-col { border-radius: 4px; } .bg-purple-dark { background: #99a9bf; } .bg-purple { background: #d3dce6; } .bg-purple-light { background: #e5e9f2; } .grid-content { border-radius: 4px; min-height: 36px; } .row-bg { padding: 10px 0; background-color: #f9fafc; } </style> </head> <body> <div id="app"> <el-row> <el-col :span="24"><div class="grid-content bg-purple-dark"></div></el-col> </el-row> <el-row> <el-col :span="12"><div class="grid-content bg-purple"></div></el-col> <el-col :span="12"><div class="grid-content bg-purple-light"></div></el-col> </el-row> <el-row> <el-col :span="8"><div class="grid-content bg-purple"></div></el-col> <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="8"><div class="grid-content bg-purple"></div></el-col> </el-row> <el-row> <el-col :span="6"><div class="grid-content bg-purple"></div></el-col> <el-col :span="6"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="6"><div class="grid-content bg-purple"></div></el-col> <el-col :span="6"><div class="grid-content bg-purple-light"></div></el-col> </el-row> <el-row> <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple-light"></div></el-col> </el-row> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el:"#app" }) </script> </body> </html>![]()
现在需要添加一行,要求该行显示8个格子,通过计算每个格子占 3 栏,具体的html 代码如下
<!-- 添加一行,8个格子 24/8 = 3 --> <el-row> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> </el-row>▶ Container 布局容器
用于布局的容器组件,方便快速搭建页面的基本结构。如下图就是布局容器效果。
如下图是官网提供的 Container 布局容器实例:
![]()
该效果代码中包含了样式、页面标签、模型数据。将里面的样式 `<style>` 拷贝到我们自己页面的 `head` 标签中;将html标签拷贝到 `<div id="app"></div>` 标签中,再将数据模型拷贝到 `vue` 对象的 `data()` 中。
▷ 整体页面代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .el-header { background-color: #B3C0D1; color: #333; line-height: 60px; } .el-aside { color: #333; } </style> </head> <body> <div id="app"> <el-container style="height: 500px; border: 1px solid #eee"> <el-aside width="200px" style="background-color: rgb(238, 241, 246)"> <el-menu :default-openeds="['1', '3']"> <el-submenu index="1"> <template slot="title"><i class="el-icon-message"></i>导航一</template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <template slot="title">选项4</template> <el-menu-item index="1-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> <el-submenu index="2"> <template slot="title"><i class="el-icon-menu"></i>导航二</template> <el-submenu index="2-1"> <template slot="title">选项1</template> <el-menu-item index="2-1-1">选项1-1</el-menu-item> </el-submenu> </el-submenu> <el-submenu index="3"> <template slot="title"><i class="el-icon-setting"></i>导航三</template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="3-1">选项1</el-menu-item> <el-menu-item index="3-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="3-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="3-4"> <template slot="title">选项4</template> <el-menu-item index="3-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> </el-menu> </el-aside> <el-container> <el-header style="text-align: right; font-size: 12px"> <el-dropdown> <i class="el-icon-setting" style="margin-right: 15px"></i> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>查看</el-dropdown-item> <el-dropdown-item>新增</el-dropdown-item> <el-dropdown-item>删除</el-dropdown-item> </el-dropdown-menu> </el-dropdown> <span>王小虎</span> </el-header> <el-main> <el-table :data="tableData"> <el-table-column prop="date" label="日期" width="140"> </el-table-column> <el-table-column prop="name" label="姓名" width="120"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> </el-table> </el-main> </el-container> </el-container> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el:"#app", data() { const item = { date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }; return { tableData: Array(20).fill(item) } } }) </script> </body> </html>![]()
▶ 完成分页条展示
在 Element 官网找到 `Pagination 分页` ,在页面主体部分找到我们需要的效果,如下
![]()
点击 `显示代码` ,找到 `完整功能` 对应的代码,接下来对该代码进行分析
![]()
▷ 上面代码属性说明:
● `page-size` :每页显示的条目数
● `page-sizes` : 每页显示个数选择器的选项设置。
`:page-sizes="[100,200,300,400]"` 对应的页面效果如下:
![]()
● `currentPage` :当前页码。我们点击那个页码,此属性值就是几。
● `total` :总记录数。用来设置总的数据条目数,该属性设置后, Element 会自动计算出需分多少页并给我们展示对应的页码。▷ 事件说明:
● `size-change` :pageSize 改变时会触发。也就是当我们改变了每页显示的条目数后,该事件会触发。
● `current-change` :currentPage 改变时会触发。也就是当我们点击了其他的页码后,该事件会触发。
来源:csdn
蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~
希望得到建议咨询、商务合作,也请与我们联系01063334945。
分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
云WAF主要利用DNS技术,通过移交域名解析权来实现安全防护,用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。
http://aliyunyd.com/

https://cloud.tencent.com/product/waf
https://www.huaweicloud.com/product/waf.html
https://www.dbappsecurity.com.cn/product/cloud119.html
https://cloud.baidu.com/product/waf.html
https://www.huaweicloud.com/product/cfw.html
https://www.safedog.cn/index/wafIndex.html
https://defense.yunaq.com/cyd/
https://www.f5.com.cn/cloud/products/distributed-cloud-waf


https://wangzhan.qianxin.com/
https://wangzhan.360.cn/panyun
https://www.wangsu.com/product/52
https://www.qianxin.com/product/detail/pid/400
https://www.nsfocus.com.cn/html/2020/458_0107/108.html
https://www.venustech.com.cn/new_type/xnWAF/
https://www.sangfor.com.cn/product-and-solution/sangfor-security/yun-web
https://www.riversecurity.com/product-Safeplus.shtml
硬件WAF通常部署在Web服务器之前,过滤所有外部访问流量,并对请求包进行解析,通过安全规则库的攻击规则进行匹配,识别异常并进行请求阻断。
常见产品:
https://www.dbappsecurity.com.cn/product/cloud150.html

https://www.chaitin.cn/zh/safeline
https://www.yxlink.com/index_product_index.html
https://www.nsfocus.com.cn/html/2019/206_0911/6.html
https://www.webray.com.cn/channel/RayWAF.html
https://www.topsec.com.cn/product/25.html
https://www.sangfor.com.cn/product-and-solution/sangfor-security/waf
https://www.venustech.com.cn/new_type/Webyyfhq/
https://www.f5.com.cn/products/security/advanced-waf
软件WAF安装在需要防护的服务器上,通过监听端口或以Web容器扩展方式进行请求检测和阻断。
https://www.safedog.cn/
https://yunsuo.qianxin.com/
https://d99net.net/
https://www.gov110.cn/

https://www.hws.com/
https://www.zcnt.com/
https://www.upupw.net/versions/
https://www.bt.cn/
https://www.xmirror.cn/
https://help.aliyun.com/product/28449.html
Web 开发是设计、开发和维护网站的数字过程。SEO,搜索引擎优化,是一种优化网站内容和元数据的做法,以提高其在 Google 等搜索引擎中的可见度或排名。在本文中,您将获得决定走哪条路线所需的所有信息!
在搜索引擎优化 (SEO) 中,对网站或网页进行优化以提高其可见性。SEO 可以被认为是在线成功的“秘密武器”。它可以帮助您的网站在搜索结果中排名更高,为您的网站带来更多流量并增加您的底线。
⇒基本上有两种类型的搜索引擎优化:内容营销和搜索引擎优化。内容营销就是创造有价值的、高质量的内容,这些内容将被其他人共享和链接。这种类型的优化侧重于提高网站上单个页面的可见性和排名,而不是整个网站。
⇒搜索引擎优化:这 是使您的网站或网页在搜索引擎中尽可能可见和相关的过程,编写出色的内容并向网站添加 SEO 关键字。目标是为您的网站带来更多流量,以便您可以从广告收入或通过这些访问者产生的销售中获利。
有许多不同的技术可用于 SEO,但最终归结为确保您的网站经过充分研究和设计,使其在任何给定搜索引擎中看起来都不错并且排名靠前。
“搜索引擎优化”(SEO) 和“网页开发”这两个术语可能会让很多人感到不解。那么,两者有什么区别呢?SEO 是改进网站以使其在搜索引擎结果页面(SERP) 中显示更高的做法。这意味着搜索特定主题信息的人会更频繁地找到您的网站。
另一方面,Web 开发是设计、创建和维护网站的过程。虽然 SEO 专注于改善网站在搜索引擎上的外观和性能,但 Web 开发不仅仅包含设计和布局。
它包括确保网站在各种设备上正常工作,优化社交媒体平台的内容,以及开发电子商务商店或 CRM 解决方案等自定义功能。
最终, SEO 和 Web 开发之间的区别 归结为目的。SEO 主要侧重于增加网站的访问量;而网络开发旨在确保用户一旦到达那里就可以真正找到他们正在寻找的东西。在大多数情况下,最好将这两种做法结合起来以达到您想要的结果。
如果您正在考虑 Web 开发或搜索引擎优化 (SEO),在做出选择之前需要考虑一些事项。下面比较了每种方法及其优缺点。
优点:您可以从头开始构建自己的网站或博客,或者使用 WordPress 等现有平台。如果您想自定义网站的外观,或者不想自己托管和维护网站,这是一个多功能选项。
此外,在大多数情况下,Web 开发成本低于 SEO,如果您不确定将来是否需要它,这可能是一个因素。
缺点:如果您没有任何构建网站的经验或不熟悉编码,则 Web 开发可能具有挑战性。
此外,Web 开发并不总是与所有类型的内容兼容——例如,某些博客使用的视频内容无法轻松转换为文本。最后,一些在线流行的网站——如福布斯——是使用网络开发技术构建的,但他们的 SEO 工作是密集且昂贵的。
优点: SEO 可以帮助您的网站或博客在与您的主题相关的特定关键字的搜索结果中排名更高。这可能会导致流量和转化率增加,从而可以通过两种方式提高您的底线:
首先,随着越来越多的人通过 Google 搜索找到您的网站,广告收入可能会增加;其次,某些网站(如 Netflix)提供的高级会员服务需要在搜索引擎结果中获得较高的排名。
缺点: SEO 是一个密集且耗时的过程,从长远来看可能很难获得一致的结果。此外,某些网站内容(例如产品说明或博客文章)可能更难通过 SEO 技术进行改进,因此如果您想要获得更好的结果,则可能需要考虑其他策略。最后,SEO 可能很昂贵,尤其是当您针对高流量关键字时。
Web 开发和搜索引擎优化 (SEO) 各有利弊。但在你做出决定之前,你需要了解你的优先事项。这里有四种策略可以帮助您决定哪一种适合您:
如果 Web 开发更符合您的风格,那就去做吧。看到您的辛勤工作在搜索引擎结果页面 (SERP) 上获得更好的排名,您会感到满意。
但是,如果您更喜欢 SEO,请准备好长时间投入大量精力。您可能更愿意与顾问一起工作,他们将逐步指导您完成整个过程,但这也意味着要为他们的服务支付额外费用。
如果您知道您的行业或地区流行什么类型的网站,那么 SEO 可能更适合您。搜索引擎会奖励针对相关关键字进行了优化的网站,因此以这些术语为目标将使您的网站在竞争中更具优势。
如果您不确定从哪里开始,请尝试使用Google 的 AdWords 工具查看相关页面上最常搜索的关键字。这会给你一些关于从哪里开始优化你的网站内容和设计的想法。
许多初学者在没有先学习如何优化他们的网站的情况下直接进行全面的 SEO 计划。这可能会很快适得其反,因为搜索引擎会惩罚包含不正确或过时信息的页面。
更好的方法是从快速提示和技巧开始,然后逐步采用更全面的策略。这样,您将有更好的机会获得预期的结果,而无需预先花费太多时间和金钱。
如果您不确定哪种方法适合您,请考虑将每种方法中的一部分结合起来的混合策略。
例如,您可以定位网站上的关键关键字,但也要确保您的网站针对搜索引擎结果页面 (SERP) 进行了优化。这将为您带来两全其美的效果——增加流量和提高排名。
来源:csdn
蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~
希望得到建议咨询、商务合作,也请与我们联系01063334945。
分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
目录
监测机制的变化、Fragments(碎片)的更新、API模式的变更、数据的存放、生命周期钩子、父子传参等。。
来源:csdn
蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~
希望得到建议咨询、商务合作,也请与我们联系01063334945。
分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
/* JS的输出语句 */ alert("弹出") document.write("直接在写页面上面") console.log("打印在控制台上面")
效果:
confirm:
var msg1 = confirm("你好!") //我可以将我们点击确定和取消的结果当做变量的值 console.log(msg1); //当我们点击确定时候得到值是一个true,当我们点击取消的时候得到的结果是false
效果如下:

prompt:
var msg = prompt("你可以在这上面输入一句话") //我们可以把这一句话当中一个变量值,赋值给一个变量 alert(msg) //将变量的值直接弹出来
效果如下:
举例:
var a = 10; //合法 var name = "张飒" //合法 var var = "李四" //不合法,不能使用关键字 var 1name = "王八" //不合法,不能以数字开头 var alert = "老刘" //合法 var name% = "美丽姐" //不合法,变量的命名要以数字,字母,下划线,$组成
注意:常见的关键字,有var ,break, for ,if …
比如:
var userName = "张三" //遵守了小驼峰的命名规范
比如:
console.log(isNaN("张三")) //true console.log(isNaN(10)) //false
比如:
// 因为他判断是不是数字 // 如果是一个数字,那结果直接是false // 如果不是一个数字,那么他会判断这个值能不能转换成数值,如果可以,那么结果是false,如果不可以,那么结果是true // boolean与number其实就是相通的 // boolean类型的true 代表数值类型的一切非0的值 // boolean类型的false 代表数值类型的0 console.log(isNaN("123"));//false console.log(isNaN("123a"));//true console.log(isNaN(11));//false console.log(isNaN(true));//false
parseInt先看第一位的值,能不能转,如果可以转,那么就转,如果不能转,那么就NaN
parseInt再看第二位的值,能不能转,如果可以,那么转,如果不能转,那就停止了
parseFloat 他比parseInt 多认识了一个小数点 .
console.log(parseInt(“12a2”))
Stringvar res = String(变量)toString()+var a = 10; var a1 = String(a) console.log(a1, typeof a1); var b1 = a.toString() console.log(b1, typeof b1); console.log(a + "~~", typeof (a + ""));
""
来源:csdn
蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加微信ban_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~
希望得到建议咨询、商务合作,也请与我们联系01063334945。
分享此文一切功德,皆悉回向给文章原作者及众读者. 免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务、UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司
蓝蓝设计的小编 http://www.lanlanwork.com