vue-shequ
1126
Container 布局組件
考慮到每一個頁面都要寫同樣的寬高大小,所以我們就引出了一個公共的布局組件 Container.vue
以及寫好了一個公共的布局組件了,但是還會有不同的頁面是只需要內容不需要頭部的那面就要使用
- 做一個公共的組件 Container.vue 用命名插槽 <slot name="head"></slot> 接收就行。
- 插槽 <temaplate #head> <slot name="head">
1126 vue-shequ
axios stylus Flex router element-ui scoped 公共布局組件 插槽 github 部署 v-if+v-for 事件修飾符.native
觸發輔助函 監聽事件 watch location 和 $route 和 $parent 和 $children 以及實例 property 的相關方法
- 把它看作大家的第一個 vue 項目。
結合 vue 社區提供的一個 API 接口做一個和他一模一樣的網站
不做:注冊,搜索可以登錄,展示文章,展示商品,可以評論,可以點贊
只做:登錄 展示,分頁,登錄后評論
思路:
一上來不能隨便寫,要想先干什么
是不是一上來你看到什么就要些什么呀,上來是不是看到了首頁呀,不是一上來 就寫個人中心頁。基本不管些什么東西都是先寫首頁。看首頁哪些東西是路由哪些不是路由
上來沒有登錄,但是有登陸接口,先寫頁面接著就有思路了。
如果你一進去就看見登錄就開始做登錄,當然這是管理系統的,不是門戶類網站的。看到小功能了就安裝一些小插件,還有發請求 axios , element-ui
-
步驟:
第一階段
先做 axios 封裝,做相關的一些配置
寫一個公共的樣式在 main.js 中導入全局引用。
然后寫 首頁 Header 頁以及 Home 頁,在 Home 頁中插入公共布局組件 Container.vue 設置公共樣式和 具名插槽 <template #xx> + <slot name="xx">
第二階段
在 created 和 mounted 這兩個發請求觸發我們的 axios 都差不多,這兩個都是同步的生命鉤子,created 執行完了, mounted 就執行。axios 發請求都是異步的,請求的結果肯定在這兩個人之后執行,但是通常習慣用 created 發請求。他們兩者又有什么區別呢?
一般 v-for 要搭配 v-if 去使用展示列表數據。
get 請求如何接收參數: 1. get(‘topics?page=1&limit=20’) 2. get(’/topics’,{params:{page:2,tab:‘sak’}})
接下來寫好地址欄信息了,就要寫點擊事件
誰改變我要拿到誰改變的那個值,那么監聽事件是最好的解決方案。watch 需要注意的地方就是 監聽誰,方法叫什么 前后改變的值 是都一上來就執行當前獲取到的
改變點擊路由時顏色的高亮 exact :class="{active:!$route.query.tab}" .router-link-active
給每個標題加上標簽,首先要分清楚他后臺是怎樣來區分的 top:true 是否置頂 good:true 是否是精華 tab:ask 分類
但是現在拿到的是字母,要做一個方法返回中文,所以就要用到過濾器,幫助我們格式化的
還有一點就是判斷標簽在問答和招聘的時候是消失的,所以要判斷一下。
還有就是給屬性名加判斷
但是后期會有一點點小問題 1:17:00 commit("getText", null); 這樣就沒有按鈕的那個事了 這個遺留一點小問題
現在開始做 id 跳轉頁面 1:24:00
接下來就要做點擊跳轉頁面的問題,有頁面的話就要有路由,寫 Topics.vue,但是想要看到對應的內容就要找相對應的接口,進入該頁面了之后拿 id 的話是怎么拿,我想的是跟拿頁面地址一樣。
總的流程是先寫一個組件,組件展示文章,就要寫 store 數據,同時也是頁面就要寫 router ,最主要的就是我跳轉到了這個頁面怎么去后臺取這個數據,更新我們的 store 數據拿 id ,
作業
- 寫日期
- 反復點的時候有問題,提供了一種方案,每次點之前都清空掉 2. 寫成一個 data,請求之后再去改
- 日期的樣式放到最后
- 標題下的日期
- 每個頁面的樣式
獲取地址欄信息判斷展示相對應的信息配套 watch 一起用
剛進來就要判斷地址欄是哪個網頁的信息,怎么去獲取呢,有兩種方法。
axios 發請求代理服務器
部署
觸發 Actions 的方式有兩種,以及拿取 state 的方法
// 方法一 import { mapActions, mapState } from "vuex"; this.getText(tab) //想在觸發的地方觸發即可methods: {...mapActions(["getText"]),},computed: {...mapState(["arrText"]), //然后就可以直接 arrText使用了this.$store.state.arrText}, // 方法二 this.$store.dispatch("getText", tab);這個是最最主要的偵聽器 watch (任何可以改變的東西他都可以監聽)
雖然計算屬性在大多數情況下更合適,但有時也需要一個自定義的偵聽器。這就是為什么 Vue 通過 watch 選項提供了一個更通用的方法,來響應數據的變化。當需要在數據變化時執行異步或開銷較大的操作時,這個方式是最有用的。
- .native 是原生的意思
總的意思就是在組件上綁定,不是在 HTML 標簽綁定。像 ul li a span 這類標簽綁定沒有用,只有在組件身上綁定才有用。
route 點擊改變顏色
<!-- 這是第一種方案 --> <!-- 也是最簡便的,只要在樣式上自己喜歡的顏色就行 .router-link-active --> <router-linktag="a":class="{'router-link-active':!$route.query.tab}"exactto="/?tab=all">全部</router-link > <!-- 這個是第二種方案 --> <!-- 必須要給每個理由加上 class 名,添加 exact 嚴格匹配--> <!-- 但是還要加上 :class="{active:!$route.query.tab}" 要不然上進頁面是沒有顏色, 必經點擊了才會觸發 active-class="active" --> <router-linkactive-class="active":class="{active:!$route.query.tab}"tag="a"exactto="/?tab=all">全部</router-link > <router-link active-class="active" tag="a" exact to="/?tab=good">精華</router-link > <router-link active-class="active" tag="a" exact to="/?tab=share">分享</router-link > <router-link active-class="active" tag="a" exact to="/?tab=ask">問答</router-link > <router-link active-class="active" tag="a" exact to="/?tab=job">招聘</router-link >xxx
過濾器 filters
- 干嘛的:用于一些常見的文本格式化
- 怎么用:過濾器應該被添加在 JavaScript 表達式的尾部,由“管道”符號指示:
- 用在哪里:雙花括號插值和 v-bind 表達式
賦值解構
const lo = this.$route.query; console.log(lo); //{tab: "job"} console.log(lo.tab); // job const { tab } = this.$route.query; console.log(tab); // job1201
任務
登錄,登錄狀態下刷新和退出
xxx
請求文章的時候加上 accesstoken 參數可以得到 改文章用戶是否收藏了或者文章評論用戶
收藏
贊
- 測試收藏,點贊沒有權限
如果不加 v-if="User" 會報錯,因為頁面一上來就會執行代碼,然而發請求數據還沒有拿到呢,所以會報錯,所以要加一層判斷,這樣就不會報錯了。
<template v-if="User"><img :src="User.avatar_url" alt="" /><span>{{ User.loginname }}</span><span>{{ User.score }}積分</span><div><img src="" alt="" /><span>@{{ User.githubUsername }}</span></div><span>注冊時間{{last(User.create_at)}}</span> </template>flex
display flex justify-content center 左右居中 align-items center 去除邊高上下居中 flex-shrink 0 不改變原本元素的大小 flex-grow 1 放到最大 overflow hidden //溢出隱藏 text-overflow ellipsis //溢出顯示標點符號 white-space nowrap //不讓換行老師說過 flex 樣式
居中樣式,三個為例,有交互的話就用一個盒子套著,沒有的話就不需要,然后最右邊的盒子放到最大,剩下的兩個靠在最右邊
記錄一下自己把功能做出來的最大喜悅
- 老師安排:在別人的個人中心頁 點擊自己的頭像可以查看自己的個人中心頁
- 我做到了超額完成:在任何地方都可以點擊頭像都可以看到自己的頁面。
- 思路
在任何地方點擊頭像都會跳到個人中心頁
- 怎么跳
- 怎么拿數據
點擊跳頁面
<router-link to="/user/Eli-v12"><img :src="UserInfo.avatar_url" alt="" /> </router-link>拿數據:
隨時監聽頁面地址的變化,如果有變化的話就把相應的那個 id 傳過去發請求
watch: {"$route.params.User_Id": {handler(newValue, oldValue) {if (newValue === "Eli-v12") {this.getUser(newValue);}else{this.getUser(newValue);}},},},還有解決一個閃現的問題
1203 始終記得老師說的一句話。你知道你現在要做什么嗎,流程是怎樣的。
先捕獲到當前是展示誰的個人中心,然后用名字去發請求拿數據,這是官方提供了一個接口 get /user/:loginname 用戶詳情 可以拿的
然后拿到數據了就可以用數據做展示了呀
也就是 User.vue 組件
唯一的難點就是跳轉到新的頁面的時候數據并不會消失,因為沒有刷新,所以數據沒有消失
接下來要做的就是刷新頁面之后數據消失了怎么才能展示頁面。
剛進入 MoreTopics 頁面的時候 User 個人的數據還在,通過 store 的 getters 計算屬性拿到 User 數據就可以做展示了。
看 store 中 User 是否存在
解決刷新之后所有頁面數據都不存在了,當前頁面拿不到數據,然后在此發請求。以下就是解決辦法
動態路由匹配
某種模式匹配到的所有路由,都映射到同一個組件上,使用同一個組件來渲染,就叫做動態路由。
{ path: '/user/:id', component: User }
參數值是 :id ,用 this.$route.params 來輸出表示。
?tab='ask' 是查詢參數,用 $route.query 來獲取。
動態路由參數 :User_Id 說
當使用通配符路由時,請確保路由的順序是正確的,也就是說含有通配符的路由應該放在最后。路由 { path: ‘_’ } 通常用于客戶端 404 錯誤。
Vue 生命鉤子
mounted 只執行一次。
updated:data 數據更新的時候會觸發
要記住現在是干什么事
截取數組展示前五條 slice(0,5)
- slice
該方法是對數組進行部分截取,該方法返回一個新數組,不會改變原數組
包含了源函數從 start 到 end 所指定的元素,但是不包括 end 元素
要寫在計算屬性里面
computed: {showCreateTopics(){const topics = this.User.recent_topicsreturn topics.length > 5 ? topics.slice(0,5) : topics} }name: ‘MoreTopics’ 命名路由
分頁器 分為兩種使用方式
vue 中文社區 js 每日一題
Gerter 和 mapGetters 映射函數 其實可以在反復的拿數據
Vuex 允許我們在 store 中定義 getter (可以認為是 store 的計算屬性)。就像計算屬性一樣,getter 的返回值會根據它的依賴被緩存起來,且只有當它的依賴值發生了改變才會被重新計算。
- 組件內使用
MoreTopics 刷新消失
csdn 發現周邊
接下來做首頁的分頁
1204
高產似母豬
null {} 的區別
使用方法有兩種 1.組件 2.指令方式
promise 這星期任務
原理記不住就給別人說你怎么用的,不能說錯了。
async 就是把里面的東西變成 promise
所以 await 可以等
有時候能用,有時候不能用,但是為什么能用。
工作中遇到的問題:聽早上視頻
點擊了之后就把 null 的清空掉
輸入網址的不會錯 重定向
組件間交互
自己嘗試安裝 yarm
我現在要干嘛
我現在想把 vue 社區總結一下,完整歸納
主題首頁,詳情
由于網站的 post 都測試不了,只做了 get 獲取的,寫入的還沒有做。
自己做用戶所收藏的主題,只有自己的主頁能看見。
要學會看 api 文檔,解讀完畢之后要看返回的對象是什么。然后基本網站都定死了。
兩大模塊:發布話題,評論話題做不了
全局過濾,全局指令,全局混入
以后項目會出現的很多:連續點擊會出問題
async && await 1204 上(0:49:00)
Promise 在哪里用來著,在項目中有沒有用過 Promise, async && await 就是 Promise 的應用。從實際從發,說不明白就說應用的東西,什么時候用過,發請求的時候 vuex 里面用了 actions,在 actions 里面發請求,前端我需要在請求之后去做一些事情,這是我就用到了 async && await 。
不加 async 和 await 的話基本動畫不會出現效果,因為數據還沒來呢,下面的代碼就已經讀完了。
加了 await 之后 ,它里面的代碼執行完畢之后才會執行下面的代碼。
await 等待 this.getText 完成
- 為什么 await 能夠等 this.getText ,等 this.getText 能夠成功才執行后面的語句。
- 因為 this.getText 能夠返回一個 promise
- this.getText 是 async 函數。
- resolve 是成功函數, 就是等上面的執行完之后才會執行
總的來說就是 async await 就是 promise 的語法糖,把 .then() .catch() 省略了
index.js
// async getText({ commit }, { tab, page }) {getText({ commit }, { tab, page }) {return new Promise(resolve,reject =>{commit("getText", null);const queryStr =tab && tab !== "all"? `?tab=${tab}&page=${page}&limit=20`: `?tab=all&page=${page}&limit=20`;// const Text = await $axios.get(`/topics/${queryStr}`);$axios.get(`/topics/${queryStr}`).then((res)=>{commit("getText", res.data);resolve()})})}第一種 方法
watch: {"$route.query": {async handler(newValue, oldValue) {const { tab, page } = newValue;this.loading = true;if (!page) {this.page = 1;}await this.getText({ tab, page: page || 1 }); //如果 index.js 發請求根本不需要等待那邊的數據成功。 除非加 await 或者返回一個 Promise 函數以及 .then()this.loading = false; // this.loading = false 是在 resolve()之后執行的。},immediate: true,},},第二種方法
404 頁面
面試
可以在 vue 社區中遇到那些不會的
請求,登錄,存儲,sessionStorage,存儲登錄狀態,
請求沖突了怎么辦,用什么方案去解決:現在我們解決的方法就是寫了一個 loading 不讓點了。
還有一個就是點擊干掉。
總結
- 上一篇: 大数据 客户标签体系_大数据标签体系建立
- 下一篇: vue项目反编译