微信小程式
微信小程式的授權流程
1、需要openID的:wx.login登入,擷取code,傳給背景,傳回openID(不會彈起授權彈窗,靜默式授權)
2、隻需要昵稱,頭像等資訊進行頁面展示的:open-data帶不同的type屬性比如userNickName,userAvatarUrl等
3、會彈起授權彈窗的,使用button标簽,帶不同的open-type,比如getUserInfo,從bindgetUserInfo回調中擷取到使用者資訊完成授權。
4、檢測登入狀态,我們需要先檢測登入狀态
wx.checkSession({
success () {
//session_key 未過期,并且在本生命周期一直有效
},
fail () {
// session_key 已經失效,需要重新執行登入流程
wx.login() //重新登入
}
})
5、檢測是否授權,微信小程式可以通過wx.getSetting來擷取授權過的所有資訊
wx.getSetting({
success (res) {
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// ...
// }
if(!res.authSetting['scope.userInfo']){
// 如果沒有授權做引導處理
}
}
})
小程式的生命周期
小程式應用的生命周期
onLaunch(小程式啟動時執行)監聽小程式初始化、
onShow(監聽小程式顯示)、
onHide(監聽小程式顯示)、
onError(監聽錯誤)
onPageNotFound(監聽頁面不存在)
小程式點選左上角的關閉以及手機home鍵的時候,觸發的是onHide()方法,此時小程式并沒有真
正的銷毀,如果使用者再次進入小程式,稱為“熱啟動”,此時小程式觸發的生命周期為onShow()
但如果長時間未打開,或者占用資源過高,微信會将小程式銷毀,使用者第一次進入小程式以及進入
銷毀後的小程式,稱為“冷啟動”,會觸發的生命周期為onLaunch->onShow
page頁面的生命周期
onLoad(頁面建立時執行)監聽頁面加載
一個頁面隻會調用一次,可以擷取query參數等
onReady(頁面首次渲染完畢時執行)、
一個頁面隻會調用一次,可以和視圖層進行互動,對界面的wx.setNavigateBarTitle的設
置可以再onReady之後。
onShow(監聽頁面的顯示)
每次打開頁面都會調用一次
onHide(監聽頁面的隐藏)
navigateTo或底部tab切換時調用
onUnload(頁面銷毀時執行)
當redirectTo或者navigateBack的時候會觸發
當初次進入小程式的時候會觸發onLoad
離開的時候會先觸發頁面的onHide,然後觸發小程式應用的onHide
進入頁面的時候會先觸發小程式應用的onShow,然後觸發頁面的onShow。
微信小程式的支付流程
首先使用者會登入然後擷取到code,通過code向後端請求拿到openID以及支付所需要的參數,例如
時間戳簽名等,然後再發起wx.requestPayment支付API,這大緻是前端需要做的流程
微信公衆号分享的簽名如何擷取
主要為後端的操作,首先微信公衆号要綁定分享的域名,然後加上IP白名單,有一個
MP_verify_EM2V8QaIKnqw5Ts2.txt
将該檔案放在機器下,然後可以編寫微信分享的接口
Vue的相關
vue的params傳參和query有什麼差別
params傳參隻能用name來引入路由,不可以用path,
this.$router.push({
name:'child', //此處需為name引入,不可以是path
params:{
id:'1',
name:'wanghaha'
}
})
然後在路由配置頁面處應該這樣寫
{
path:'index/:id/:name',
name:'child',
component:()=>import(@/view/child)
}
接收參數時為
this.id = this.$route.params.id
this.name = this.$route.params.name
query傳參用path引入路由,如果配置路由頁面的name和path名字相同,也可以使用name
this.$router.push{
path:'child',
query:{
id:'1',
name:'wanghaha'
}
}
接收參數時為
this.id = this.$route.query.id
this.name = this.$route.query.name
params傳參屬于路由的一部分,必須在路由後面添加參數,query是拼接URL參數。如果使用
params,沒有傳這個參數,會導緻跳轉錯誤或者空白。
$router是路由操作對象,隻寫
$route是路由資訊對象,隻讀
vue的push和replace的差別
this.$router.push()
,會向history頁面棧中添加一條記錄,可以傳回上一個頁面
this.$router.replace()
,不會向history存入任何資訊,傳回的時候會傳回上上個頁面,不會存在上一個頁面的記錄;
this.$router.go(n)
,相對于目前頁面向前或者向後跳轉n個頁面,相當于
window.history.go(n)
,可為正數可為負數,正數傳回上一個頁面
vue的v-if和v-show有什麼差別
v-show屬于标簽最開始就存在的一個标簽,相當于display:none和block來顯示隐藏的,v-if是根據不同的條件dom節點的存在與否來展示的
v-if和v-for能在同一個标簽中使用嗎?
最好不要在一個标簽中使用,因為v-for的優先級比v-if高,例如要判斷一個代碼展示與否的時候,還是會先周遊整個數組,然後在判斷是否展示,耗性能,可以使用computed方法,或者将v-if換成v-show
keep-alive
keep-alive是一個抽象的元件,它不會自己渲染dom,也不會出現在父元件鍊中,使用keep-alive包裹動态元件時,會緩存不活動的元件,并不會銷毀它們。keep-alive可以儲存頁面或元件的狀态,還可以避免元件的反複建立和渲染
es6相關的
es6的箭頭函數能作為構造函數嗎?
es6的箭頭函數不能作為構造函數,es6中的this指向他的父作用域,普通函數的this指向調用它的地方。
react相關的
react中key的作用
key是目前清單的元素唯一的,不是全局唯一,可以識别哪些元素改變了,增加或者删除等,最好不要使用清單的索引作為key值,因為如果清單順序發生改變,索引會錯亂,盡量使用清單資料的ID值等。
redux遵循的原則
1、單一的資料源,整個應用的state被存在同一個object tree裡面,并且這個object tree隻存在于唯一一個store裡面
2、狀态State是隻讀的,唯一改變state的方法是action,action是一個用于描述一個已發生改變事件的普遍對象
3、使用純函數來接受修改
redux工作原理(個人了解)
使用者會通過store.dispatch()來先觸發action,然後store會自動調用reducer,傳入目前的state和action,reducer會傳回新的state,state發生了變化,store會設定監聽,store.subscribe(listener),listener會通過store.getState()得到目前狀态
ant-design的時間元件怎麼設定預設時間
時間元件會有一個defaultvalue屬性,可以指令行安裝moment插件,然後引入,使用moment設定預設值
import moment from 'moment';
<Timepicker defaultValue={moment('13:20:50','HH:mm:sss')} />
//日期選擇元件同理
CSS相關的
用css畫一個箭頭
可以使用僞類選擇器,然後設定上邊框和下邊框,然後設定旋轉角度,就可以寫出一個不帶背景色的箭頭
<div class='arrawpoint'></div>
.arrawpoint:after{
content:'';
width:10px;
height:10px;
border-top:1px solid #f4f4f4;
border-bootm:1px solid #f4f4f4;
transform:rotate(45deg);
}
//三角形
<div class='delta'></div>
.delta{
width:10px;
height:10px;
position:relative;
}
.delta:after{
content:'';
position:absoulte;
border-left:4px solid #f4f4f4;
border-top:4px solid transparent;
border-bottom:4px solid transparent; // transparent為透明
}
實作左邊固定,右邊自适應
//左邊的元素設定向左浮動
<div class="left"></div>
<div class="right"></div>
html,body{
width:100%;
height:100%;
}
.left{
width:100px;
height:100%;
background:red;
float:left;
}
.right{
background:pink;
height:100%;
}
//用定位,是左邊的元素定位
.left{
width:100px;
position:absolute;
background:red;
height:100%;
}
.right{
background:pink;
margin-left:100px;
height:100%;
}
//使用flex布局
<div class="parent">
<div class="left"></div>
<div class="right"></div>
</div>
.parent{
display:flex;
}
.left{
width:100px;
background:red;
}
.right{
flex:1;
background:pink;
}
雙飛翼布局和聖杯布局(兩側寬度固定,中間自适應)
聖杯布局
//首先是dom結構
<div class='header'></div>
<div class='container'>
<div class='center'></div>
<div class='left'></div>
<div class='right'></div>
</div>
<div class='footer'></div>
<style>
body{
min-width:500px;
}
.container{
padding-left:200px;
padding-right:100px;
}
.container>div{
float:left;
}
.center{
width:100%;
}
.left{
width:200px;
margin-left:-100%;
position:relative;
right:200px;
}
.right{
width:100px;
margin-right:-100px;
}
//設定左中右三個元素為float:left,然後左邊的設定margin-left為-100%,設定定位
relative屬性,right屬性,中間的設定width:100%,右邊的設定margin-right為負的
它本身的寬度。
</style>
雙飛翼布局
<div id="container" class="column">
<div id="center">中間</div>
</div>
<div id="left" class="column">左邊</div>
<div id="right" class="column">右邊</div>
<div class="footer"></div>
<style>
#container{
width:100%;
}
.column{
float:left;
}
#center{
margin-left:200px;
margin-right:100px;
}
#left{
width:200px;
margin-left:-100%;
}
#right{
width:100px;
margin-left:-100px;
}
</style>