model 數(shù)據(jù)
view 頁面
viewModel Vue實(shí)例
說明: 文本數(shù)據(jù)渲染
用法: v-text = 'Vue實(shí)例中的數(shù)據(jù)' => 簡寫 {{Vue實(shí)例中的數(shù)據(jù)}}
相當(dāng)于JavaScript中的innerText
說明: HTML渲染數(shù)據(jù)
用法:v-html = 'Vue實(shí)例中的數(shù)據(jù)'
會解析html結(jié)構(gòu) 渲染至頁面
相當(dāng)于JavaScript中的innerHTML
注意: 在網(wǎng)站上動態(tài)渲染任意的 HTML 是非常危險(xiǎn)的!!! 因?yàn)槿菀讓?dǎo)致 XSS 攻擊 只在可信內(nèi)容上使用 v-html 絕對不要用在用戶通過(提交)的內(nèi)容上使用
說明: 事件綁定(綁定事件監(jiān)聽器)
用法: v-on:事件名 = '事件處理函數(shù)' => 簡寫 @事件名 = '事件處理函數(shù)'
methods
中 注意: 操作Vue實(shí)例上的數(shù)據(jù)要跟上 this
- $event.target 獲取當(dāng)前事件觸發(fā)的DOM元素
- $event.path[0](el.path[0]) 也可以獲取當(dāng)前事件觸發(fā)的DOM元素 path數(shù)組中有從觸發(fā)事件源的元素的所有上一級元素 直到window
- 實(shí)參不傳遞(沒有任何參數(shù)) 默認(rèn)在形參中第一個(gè)就是事件參數(shù)
實(shí)參傳遞 就必須傳遞$event 來獲取獲取事件參數(shù)
很重要!有些第三方組件可能內(nèi)部并沒有設(shè)置原生的事件 就可以通過.native來觸發(fā)事件
面試問及
之前在使用餓了么UI的時(shí)候給一個(gè)組件添加一個(gè)原生的事件
但是一直觸發(fā)不了
后面查閱文檔發(fā)現(xiàn)這個(gè)組件內(nèi)部并沒有注冊我使用的原生事件
事件修飾符.native就可以直接監(jiān)聽并觸發(fā)組件的原生事件
說明: 屬性綁定(行內(nèi)屬性)
用法: v-bind:屬性名='Vue實(shí)例中的數(shù)據(jù)' => 簡寫 :屬性名='Vue實(shí)例中的數(shù)據(jù)'
當(dāng)Vue實(shí)例中的數(shù)據(jù)改變之后 頁面會同步更新
:class = '{'red' : isRed}'
isRed = true 就有red這個(gè)類
isRed = false 就沒有red這個(gè)類
isRed 在 Vue 實(shí)例data中聲明
class = 'red' :class = '{'yellow' : isYellow}'
:style = '{fontSize : mySize 'px'}'
說明: 雙向數(shù)據(jù)綁定
用法: v-model = 'Vue實(shí)例中的數(shù)據(jù)'
數(shù)據(jù)能夠自動的從內(nèi)存中顯示到頁面上去
注意: v-model 只能設(shè)置給from表單屬性
說明: 循環(huán)渲染
用法: v-for = '(item,index) in items' :key = 'index'
items是源數(shù)據(jù)數(shù)組
item是被迭代的數(shù)組元素的別名
index是被迭代的數(shù)組元素的下標(biāo)(索引)
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
...
這種修改數(shù)組中的元素是無法實(shí)現(xiàn)數(shù)據(jù)改變后頁面會同步改變(只會修改data中的數(shù)據(jù) 但是頁面不會同步改變)
this.arr.splice(index,0,新值)
this.arr.splice(index,1)
this.arr.splice(index,1,新值)
說明: 條件(表達(dá)式或布爾值)判斷渲染
用法:v-if = '表達(dá)式或布爾值'
v-else-if = '表達(dá)式或布爾值'
v-else
v-if 和 v-else-if 后面必須跟表達(dá)式或布爾值
v-else-if 和 v-else 不能獨(dú)立使用 必須跟在 v-if 后面
說明: 條件渲染
用法: v-show = '表達(dá)式或布爾值'
根據(jù)表達(dá)式或布爾值的真假切換元素的display屬性
v-show 不支持 <template>元素 也不支持
v-else
都是用來判斷渲染數(shù)據(jù)的
1.有較高的切換性能消耗
2.惰性渲染 第一次如果條件為false 則不會渲染到頁面 需要等后面條件切換后才會進(jìn)行第一次渲染
3.條件切換是切換DOM數(shù)中這個(gè)元素的移除或添加
4.如果運(yùn)行時(shí)條件很少改變則使用v-if
1.有較高的初始渲染消耗
2.初始渲染 不管條件 第一次加載頁面的時(shí)候都會渲染到頁面
3.條件切換只是切換元素的display屬性
4.如果運(yùn)行時(shí)條件會非常頻繁的切換則使用v-show
說明: 這個(gè)指令保存在這個(gè)元素上 直到關(guān)聯(lián)實(shí)例結(jié)束編譯
插值表達(dá)式在網(wǎng)絡(luò)較滿的情況下可能會出現(xiàn)數(shù)據(jù)閃爍問題
可以通過給實(shí)例(#app)盒子添加一個(gè)v-cloak
指令
通過這個(gè)指令的特性(如頁面中還有插值表達(dá)式就會存在這個(gè)指令 如果頁面的插值表達(dá)式都被替換成數(shù)據(jù) 就會自動移除這個(gè)標(biāo)簽)
配合css[v-cloak]{display:none|opacity:0}
來解決數(shù)據(jù)閃爍的問題
說明: 這個(gè)指令添加的元素 內(nèi)部的胡子語法只會在第一次渲染的時(shí)候執(zhí)行解析一次 后面數(shù)據(jù)發(fā)生改變后也不會觸發(fā)更新
某些元素只需要解析一次 后續(xù)不需要更新 就可以使用這個(gè)指令 提升性能
建議使用id 因?yàn)閕d是唯一的 一個(gè)Vue實(shí)例綁定一個(gè)頁面元素
可以通過this.xxx 獲取Vue實(shí)例上的數(shù)據(jù)或方法
必須要有 return 值
執(zhí)行時(shí)機(jī):
初始化顯示執(zhí)行和函數(shù)中用到了data中的數(shù)據(jù)變化后會執(zhí)行
{{計(jì)算屬性函數(shù)名}}
計(jì)算屬性本質(zhì)就是一個(gè)方法 但是使用的時(shí)候是將這些方法的方法名當(dāng)作屬性使用 計(jì)算屬性的值就是return
出來的值1.使用get和set函數(shù) 需要把計(jì)算屬性函數(shù)改成計(jì)算屬性對象
2.計(jì)算屬性默認(rèn)執(zhí)行g(shù)et方法(根據(jù)相關(guān)的數(shù)據(jù)計(jì)算返回當(dāng)前屬性的值)
3.當(dāng)計(jì)算數(shù)學(xué)值自身改變后執(zhí)行set方法
4.可以用來計(jì)算稅前和稅后的互推算
緩存 => {計(jì)算屬性名:'數(shù)據(jù)結(jié)果'} 鍵值對
形參(newVal,oldVal) => (改變后的值,改變前的值)
watch默認(rèn)無法偵聽復(fù)雜數(shù)據(jù)類型 需要偵聽復(fù)雜數(shù)據(jù)類型 得使用深度偵聽
watch:{ XXX:{ deep:true, handler(newVal,oldVal){ // 處理代碼 } }}
watch: { // watch里面的 $router 這些對象前面不要帶this '$route.path'(newVal, oldVal) { if (newVal.indexOf('/login') >= 0) { this.welcom = '歡迎登陸'; } if (newVal.indexOf('/register') >= 0) { this.welcom = '歡迎注冊'; } }}
watch: { $route: function(newVal,oldVal) { console.log(this.$route.path); } }
使用或偵聽器嗎 在Vue中碰到過什么bug
1.偵聽器用來檢測數(shù)據(jù)的改變
2.當(dāng)偵聽的那個(gè)數(shù)據(jù)發(fā)生改變后就會觸發(fā)偵聽器中的對應(yīng)函數(shù)
3.一般我更多的使用是用偵聽路由的變化 => 重新獲取數(shù)據(jù)(如搜索在對應(yīng)的router-view中顯示對應(yīng)的數(shù)據(jù))
4.之前碰到過一個(gè)坑點(diǎn) 偵聽器默認(rèn)無法偵聽復(fù)雜數(shù)據(jù)類型
5.后面使用深度偵聽 depp:true 來解決了這個(gè)問題
6.或者偵聽精確到對象中的那個(gè)值也可
聲明全局過濾器 一定要在實(shí)例化Vue之前聲明
Vue.filter('formatData', (形參=管道符前面的數(shù)據(jù),形參=想要傳入的數(shù)據(jù)...) => { 處理數(shù)據(jù); `返回`處理之后的數(shù)據(jù)});
filters:{ formatTime(形參=管道符前面的數(shù)據(jù),形參=想要傳入的數(shù)據(jù)...){ 處理數(shù)據(jù); `返回`處理之后的數(shù)據(jù) } }
{{data | formatTime | formatTime1 | ...}}
獲取data中的所有數(shù)據(jù)
用于當(dāng)前Vue實(shí)例的初始化選項(xiàng) 可以獲取自定義選項(xiàng)
new Vue({ customOption: 'foo', created: function () { console.log(this.$options.customOption) // => 'foo' }})
返回的是一個(gè)DOM對象
組件的出現(xiàn)就是為了拆分Vue實(shí)例的代碼量 能夠讓我們以不同的組件來劃分不同的功能模塊 需要什么功能就去調(diào)用對應(yīng)的模塊即可
局部功能界面
是從代碼的邏輯角度去劃分的 方便代碼分層開發(fā) 保證每個(gè)功能模塊的職能單一
是從UI界面的角度進(jìn)行劃分的 前端的組件化方便UI組件的重用
Vue.component('組件名',{參數(shù)})
組件名請使用小寫
大寫需要駝峰命名法
Vue.component('sayHiBaby',{參數(shù)})頁面中標(biāo)簽使用 <say-hi-baby></say-hi-baby>
父向子傳參
通過 props 向子組件傳遞數(shù)據(jù)
可以在組件實(shí)例中通過 this.xxx 拿到傳遞過來的值
高級寫法(props驗(yàn)證)
props:{ xxx:{ // 數(shù)據(jù)類型 type:'String', // 必須傳遞 required:'true', // 默認(rèn)值 default:'mystring' .... }}
props可以傳遞任何數(shù)據(jù)類型 包括函數(shù)
組件中的數(shù)據(jù)data是一個(gè)函數(shù) 將數(shù)據(jù)寫在返回出去的對象中即可
為什么組件的data是一個(gè)函數(shù) 而Vue實(shí)例的data是一個(gè)對象?
1.每一個(gè)Vue組件都是一個(gè)Vue實(shí)例
2.都是通過new Vue() 創(chuàng)建出來的
3.如果data是一個(gè)對象的話 那么這些組件的引用指向就會相同
4.一個(gè)的值修改后 其他的值也會修改(這是JavaScript語法的特性)
5.如果data是一個(gè)函數(shù) 函數(shù)中再返回一個(gè)對象
6.那么每個(gè)Vue組件都有了自己的作用域 互不干擾
模版
Vue生命周期鉤子 || Vue生命周期函數(shù)
Vue提供給開發(fā)者一系列的回調(diào)函數(shù) 讓我們可以在Vue的各個(gè)階段添加自定義的邏輯處理
創(chuàng)建期間的生命周期函數(shù)(1次)
常用
如果要操作data中的數(shù)據(jù)和methods中的方法 最早只能在created中調(diào)用常用
發(fā)送ajax請求 啟動定時(shí)器等異步任務(wù) 操作DOM中的節(jié)點(diǎn)Vue渲染解析插值表達(dá)式 并不是在頁面中直接渲染解析 而是將整個(gè)掛載在Vue實(shí)例的模版 拿到內(nèi)存中去解析 等全部解析完成后 再一次性的渲染到頁面(批量) (因?yàn)橛锌赡茼撁嬷杏泻芏嘁粯拥膁ata中的值 如果是在頁面中直接渲染解析會很耗性能)
運(yùn)行期間的生命周期函數(shù)(0次-多次)
銷毀期間的生命周期函數(shù)(1次)
常用
做收尾工作 如:清除定時(shí)器...想要銷毀Vue實(shí)例 調(diào)用 vm.$destroy() 即可
注意: 這個(gè)方法方法并不會銷毀Vue實(shí)例的一些如 定時(shí)器或計(jì)時(shí)器等方法
會造成 '內(nèi)存泄漏' 所以在完全銷毀之前 需要在 beforeDestory 鉤子中清除定時(shí)器等...
<comSon num='xxx' max='xx' :min='x'></comSon>
this.$emit('事件名A','參數(shù)')
<com @事件名A='自己methods中的方法'></com>
url地址和組件之間的關(guān)系
必須添加 Vue.use(VueRouter)
import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)
tag屬性
來設(shè)置最后被渲染的標(biāo)簽to屬性
指定跳轉(zhuǎn)的鏈接<router-link to='/login' tag='span'>登陸</router-link><router-link to='/logout' tag='span'>注冊</router-link>
<router-view></router-view>
const login = { template: '#tempLogin' };const logout = { template: '#tempLogout' };
const routes = [ { path: '/login', component: login }, { path: '/logout', component: logout }];
const router = new VueRouter({ routes});
在Vue實(shí)例中 綁定router
new Vue({ el:'xxx', router})
設(shè)置路由匹配成功后 router-link 的樣式屬性
/login => /login/user觸發(fā) 添加樣式
/login/user => /login/user觸發(fā) 添加樣式
點(diǎn)了跳轉(zhuǎn) 沒有任何邏輯 類似于(a標(biāo)簽設(shè)置了href)<router-link to='地址'>XXX</router-link>
跳轉(zhuǎn)的同時(shí)執(zhí)行其他需要執(zhí)行的邏輯router.push('地址')
/user
=> /user/:id
:id
只是一個(gè)占位/user
=> /user/123
this.$route.params.(id)
獲取傳遞過來的數(shù)據(jù){path:'地址1',redirect:'跳轉(zhuǎn)到的新地址2'}
const router = new VueRouter({ ... })router.beforeEach((to, from, next) => { // ... next()})
to
去哪個(gè)路由
一般通過to來判斷對應(yīng)路由做對應(yīng)處理
from
來自哪個(gè)路由
next()
必須next()才可以繼續(xù)跳轉(zhuǎn)頁面(像node'express'里面的中間件)
1.判斷登陸狀態(tài) 如判斷token...
2.可以在跳轉(zhuǎn)路由時(shí)先判斷這個(gè)頁面這個(gè)用戶是否有權(quán)限訪問...
3.可以每次路由跳轉(zhuǎn)前都提示用戶跳轉(zhuǎn)至什么頁面...
meta: { requiresAuth: true }
<router-view></router-view>
children:[ ]
注意
嵌套路由的path不要加 /
{ path: '/user', component: User, children: [ { path: 'index', component: Index } ]}
配置錯(cuò)誤路由規(guī)則
{path:'/NotFound',component:NotFound}
{path:'*',redirect:'.NotFound'}
import Foo from './Foo.vue';
修改成 const Foo = () => import('./Foo.vue')
其他不變 即可Axios是一個(gè)基于 promise(實(shí)現(xiàn)了鏈?zhǔn)秸{(diào)用)
的 HTTP 庫 可以用在瀏覽器和 Node.js 中 專注于發(fā)請求 專注于網(wǎng)絡(luò)請求的一個(gè)庫`
<script src='https://unpkg.com/axios/dist/axios.min.js'></script>
成功回調(diào)
失敗回調(diào)
// 為給定 ID 的 user 創(chuàng)建請求axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });// 可選地,上面的請求可以這樣做axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
基礎(chǔ)的地址應(yīng)用 沒有必要每次都寫 可以直接抽離出來
axios.defaults.baseURL = '設(shè)置的基地址'Vue.prototype.$axios = axios
axios填寫路徑時(shí)后面直接寫對應(yīng)的路徑即可
前面的公共部分不需在寫(寫了也不會影響)
axios.defaults.withCredentials = true
const xxx = axios.create({ // 即地址 baseURL: 'https://some-domain.com/api/', // 可以統(tǒng)一設(shè)置請求頭 headers: {Authorization: token}});xxx.get()xxx.post()
axios.interceptors.request.use(function (config) { // 可以在發(fā)請求之前在這里設(shè)置一些請求頭 `config.headers.Authorization=token` return config; }, function (error) { // Do something with request error return Promise.reject(error); });
axios.interceptors.response.use(function (response) { // 可以在獲取響應(yīng)數(shù)據(jù)之后設(shè)置一些提示 如獲取失敗/成功 `response.data.code == 200?` return response; }, function (error) { // Do something with response error return Promise.reject(error); });
vue-resource已經(jīng)不再更新 推薦使用Axios
Vue提供的讓程序員可以在動畫的各個(gè)時(shí)機(jī) 添加 自定義邏輯 的鉤子 也可稱之為 動畫鉤子或動畫函數(shù)
// 指定顯示的transitionxxx-enter-active// 指定隱藏的transitionxxx-leave-active// 指定隱藏時(shí)的樣式xxx-enter/xxx-leave-to
transition標(biāo)簽包裹
transition-group標(biāo)簽包裹
動畫樣式的開始類名
解析為的標(biāo)簽名
<transition v-on:before-enter='beforeEnter' v-on:enter='enter' v-on:after-enter='afterEnter' v-on:enter-cancelled='enterCancelled' v-on:before-leave='beforeLeave' v-on:leave='leave' v-on:after-leave='afterLeave' v-on:leave-cancelled='leaveCancelled'> <!-- ... --></transition>
// ...methods: { // -------- // 進(jìn)入中 // -------- beforeEnter: function (el) { // ... }, // 當(dāng)與 CSS 結(jié)合使用時(shí) // 回調(diào)函數(shù) done 是可選的 enter: function (el, done) { // ... done() }, afterEnter: function (el) { // ... }, enterCancelled: function (el) { // ... }, // -------- // 離開時(shí) // -------- beforeLeave: function (el) { // ... }, // 當(dāng)與 CSS 結(jié)合使用時(shí) // 回調(diào)函數(shù) done 是可選的 leave: function (el, done) { // ... done() }, afterLeave: function (el) { // ... }, // leaveCancelled 只用于 v-show 中 leaveCancelled: function (el) { // ... }}
npm install vuex --save
import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({ state: { // 數(shù)據(jù) count: 0 }, mutations: { // 方法 increment (state) { state.count } }})new Vue({ el:xxx, // 掛載到Vue實(shí)例上 store})
{{$store.state.count}}
this.$store.state.count
this.$store.commit(''mutations中的方法,'參數(shù)')
<template></template>
<script>export default {}</script>
<style></style>
把很多開發(fā)中需要用到的功能整合到了一起 讓Vue開發(fā)人員專注于邏輯代碼即可 是用webpack配置出來的
vue create 項(xiàng)目名
<= 項(xiàng)目名不要有中文!!!不要大些cd 項(xiàng)目名
npm run serve
npm init webpack '項(xiàng)目名'
cd '項(xiàng)目名'
npm instal
npm run dev
最后一步選 No, I will handle that myself 自己再npm i 下載速度會快一點(diǎn)
|-- build : webpack 相關(guān)的配置文件夾(基本不需要修改) |-- dev-server.js : 通過 express 啟動后臺服務(wù)器|-- config: webpack 相關(guān)的配置文件夾(基本不需要修改) |-- index.js: 指定的后臺服務(wù)的端口號和靜態(tài)資源文件夾|-- node_modules |-- src : 源碼文件夾 |-- components: vue 組件及其相關(guān)資源文件夾 |-- App.vue: 應(yīng)用根主組件 |-- main.js: 應(yīng)用入口 js|-- static: 靜態(tài)資源文件夾|-- .babelrc: babel 的配置文件|-- .eslintignore: eslint 檢查忽略的配置|-- .eslintrc.js: eslint 檢查的配置|-- .gitignore: git 版本管制忽略的配置|-- index.html: 主頁面文件|-- package.json: 應(yīng)用包配置文件|-- README.md: 應(yīng)用描述說明的 readme 文件
xxx.vue
中assets
文件夾下面 直接使用對應(yīng)路徑引用即可main.js
=> import '路徑'
組件內(nèi)的script標(biāo)簽
=> @import url('路徑')
main.js
中import 組件 from 地址
Vue.component('組件名',組件)
import 組件名 form '地址'
components
就可以在導(dǎo)入的組件中通過組件名使用該組件name:值
即可npm install vue-router
import VueRouter from 'vue-router'
xxx.vue
import 組件名 from '組件路徑'
const routes = [{path:'/xxx/:xx},component:組件名]
`const router = new VueRouter({ routes})`
`new Vue({ router})`
main.js
app.vue
components
assets
npm install -D less-loader less
<style lang='less'></style>
也可以直接導(dǎo)入less文件npm install -D sass-loader node-sass
<style lang='scss'></style>
也可以至今導(dǎo)入scss文件scoped
屬性即可為元素添加隨機(jī)屬性
樣式中添加屬性選擇器
2者結(jié)合 就把css的作用范圍 約束
export default xxx
只能寫一個(gè) 如果需要暴露多個(gè) 可以在default后面寫對象import xxx from '模塊'
export const bbb
導(dǎo)出和導(dǎo)入的名字必須一樣import {bbb} from '模塊'
餓了么前端團(tuán)隊(duì)開發(fā)的PC端的基于Vue的組件
內(nèi)部封裝了很多現(xiàn)成的組件
在VueCLI中使用elementUInpm i element-ui
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
有些組件并沒有在組件內(nèi)部使用原生事件
但是有些情況需要一些原生事件
就可以使用.native
修飾符來觸發(fā)
返回所有匹配成功的值
創(chuàng)建一個(gè)新數(shù)組,
其包含通過所提供函數(shù)實(shí)現(xiàn)的測試的所有元素
(數(shù)組過濾)
const oldArr = ['dajsk', 'dkjdklas', 'kgjftlk', 'ksf', 'ds', 'mfksjjks'];let res = oldArr.filter((val, index) => val.indexOf('d') != -1); // 返回所有匹配成功的值console.log(res); // [ 'dajsk', 'dkjdklas', 'ds' ]
返回匹配的第一個(gè)值
返回?cái)?shù)組中滿足提供的測試函數(shù)的第一個(gè)元素的值
沒有匹配成功返回undefined
const oldArr = ['dajsk', 'dkjdklas', 'kgjftlk', 'ksf', 'ds', 'mfksjjks'];let res1 = oldArr.find((val, index) => val.indexOf('d') != -1); // 返回匹配的第一個(gè)值console.log(res1); // dajsk
將匹配成功的值做對應(yīng)的計(jì)算后再次返回
創(chuàng)建一個(gè)新數(shù)組
其結(jié)果是該數(shù)組中的每個(gè)元素都調(diào)用一個(gè)提供的函數(shù)后返回的結(jié)果
const oldArrMap = [3, 4, 7, 1, 8, 5];let res2 = oldArrMap.map((val, index) => { // 將匹配成功的值做對應(yīng)的計(jì)算后再次返回 if (val > 5) { val = val * 2; } return val;});console.log(res2); // [ 3, 4, 14, 1, 16, 5 ]
因?yàn)檫@些??????方法都是返回的新數(shù)組 并沒有覆蓋原來的數(shù)組所以可以繼續(xù)鏈?zhǔn)秸{(diào)用數(shù)組的方法繼續(xù)過濾
遍歷數(shù)組
方法對數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)
const oldArrForEach = [3, 6, 8, 2, 8, 0];let num = 0;oldArrForEach.forEach((val, index) => { num = val;});console.log(num); // 27oldArrForEach.forEach((val, index) => { if (index == 2) return console.log(val); // 8});
注意
需要在瀏覽器聲明callback去的函數(shù)
需要在script請求前聲明
兼容性強(qiáng)
只能發(fā)送get請求
網(wǎng)絡(luò)請求設(shè)計(jì)方法時(shí)
考慮到數(shù)據(jù)的操作主要:增刪改查
方法的命名可以體現(xiàn)這個(gè)操作
一般常用的就是get和post
無狀態(tài)
的每次請求 瀏覽器和服務(wù)器交互完畢后 彼此并沒有留下什么
繼續(xù)請求 也無法判斷你是誰
如登陸功能
為了能夠保存一些信息
服務(wù)器返回響應(yīng)報(bào)文時(shí) 會偷偷的帶一個(gè)響應(yīng)頭
作用是在瀏覽器中偷偷保存一些信息set-cookie
瀏覽器接收到這個(gè)響應(yīng)頭后 會在本地保存這個(gè)響應(yīng)頭
第二次請求時(shí) 瀏覽器就會自動帶上這個(gè)信息去服務(wù)器
服務(wù)器接收到這個(gè)信息 就知道你是誰了
ajax跨域請求 默認(rèn)不攜帶cookie 需要設(shè)置
跨域cookie在瀏覽器中無法看到 需要抓包
Seesion 是將用戶數(shù)據(jù)存儲在服務(wù)器中
通過sessionId來驗(yàn)證查找服務(wù)器中的用戶信息
sessionId一般是存放在瀏覽器的cookie中的
所以Session需要配合瀏覽器的cookie或者瀏覽器的其他存儲技術(shù)一起使用
和cookie差不多 也可以記錄登陸狀態(tài)
服務(wù)器生成的
通過用戶瀏覽器版本、用戶信息...生成的一個(gè)密鑰
瀏覽器不會自動保存
可以接口本地存儲來保存token
瀏覽器不會自動攜帶發(fā)送
每次請求接口時(shí)可以通過headers攜帶存儲的tokenheaders{ Authorization :token }
可以把數(shù)據(jù)存儲到本地(瀏覽器) 只要用戶不刪除 則會一直保存 每個(gè)域名都是獨(dú)立的保存數(shù)據(jù) 不同域名不能互相訪問 長久保存數(shù)據(jù)可以存儲到 localStorage 可以存儲5M數(shù)據(jù)
localStorage.setItem(key,value)
localStorage.getItem(key)
=> 如果沒有這個(gè)數(shù)據(jù) 則返回 null
localStorage.removeItem(key)
localStorage.clear()
短暫存儲數(shù)據(jù) 可以多頁面?zhèn)髦?相當(dāng)于localStorage會更安全 瀏覽器關(guān)閉后就不會保存了 可以存儲5M數(shù)據(jù)
sessionStorage.setItem(key,value)
sessionStorage.getItem(key)
=> 如果沒有這個(gè)數(shù)據(jù) 則返回 null
sessionStorage.removeItem(key)
sessionStorage.clear()