使用Vue項目寫了一個移動端項目,而後又把項目硬生生的抽離了組件,一直忙着寫RN項目沒有時間總結心得,今天上午終於下定決心,寫點總結。javascript
一、position:absolute: 定位的時候不一樣手機的瀏覽器版本不同,存在兼容性問題,因此要修改成fixed,而後使用left: calc(50% - 1rem )進行定位;php
二、event.touches[0].pageY:移動端事件touchstart,touchmove,touchend,在vue中的手指滑動的對象是要傳入$event纔可使用event.touches[0].pageY等值;html
三、返回頂部:根據touchend事件判斷document.body.scrollTop的值是否大於1000來控制返回頂部按鈕的顯示和隱藏;vue
四、彈窗定位: postion: absolute; left: 50%; top: 50%; margin-top: -height/2; margin-left: -width/2;java
五、localstorage:存儲對象的時候存儲的是字符串JSON.stringify(),取的時候是對象( JSON.parse() );webpack
六、@input: 實時監聽input中的值的時候,focus和blur都不能知足需求的時候可使用input事件;git
七、分享組件: (1)<a href="http://service.weibo.com/share/share.php?appkey=&title=&url=&searchPic=false&style=simple" target="_blank"><img src="/static/weibo.png" alt="wechat">分享到微博</a>;github
八、左右滑動效果:的時候可使用overflow-x:auto,可是在蘋果手機上會有問題,解決兼容的方法是:-webkit-overflow-scrolling: touch;web
九、移動端使用百度分享的時候: vue-router
created(){
window._bd_share_main && window._bd_share_main.init()
},
mounted(){
window._bd_share_main && window._bd_share_main.init()
},
不然百度分享會出現點擊兩次纔出現分享按鈕,同時在index.html作出相應的配置;
十、異步渲染: 在vue項目中的有時候因爲異步的緣由致使dom渲染問題,獲取不到對應的節點,在使用this.$nextTick無效的狀況,可使用 setTimeout等待dom加載完成以後執行函數,不過不推薦,會有性能問題;
十一、移動端H5實現上傳圖片: http://javascript.ruanyifeng.com/htmlapi/file.html#toc0,推薦看一下這個,使用H5 API中的readAsDataURL,獲取圖片返回的base64編碼data-uri對象。,而後去請求後臺的返回圖片路徑,在處理圖片顯示的時候,會有兩種選擇: (1)不請求後臺,直接渲染圖片(2)base64請求後臺,渲染圖片,還有就是刪除的時候要保持和數據庫同步;
十二、移動端不支持select,本身div模擬select下拉效果;
1三、請求傳參: 傳遞參數的時候是包含#的url的時候,後臺可能不識別#,須要編碼的可使用encodeURI(),encodeURIComponent();
1四、Hybrid: 和原生交互的時候,給IOS傳遞參數的時候,使用 window.location.href = "next://";那麼IOS就能夠接受到next這個參數;
1五、導航鉤子:判斷離開一個路由的時候執行一個方法route1.beforeEach((to, from, next) => {
if( from.path == '/theme_detail' ){
console.log( 88888 )
}
next()
});
export default route1
1六、iphone5s不兼容display:flex:處理方法: display:-webkit-flex;-webkit-box; flex:1; -webkit-flex: 1;-webkit-box-flex:1;
1七、原生和IOS交互的時候,IOS使用第三方庫WebViewJavascriptBridge,原生調用js方法,在js中的時候使用方法: 一個js文件全局配置const BridgeMixin = {
methods: {
setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
}
}
export {
BridgeMixin
},而後在調用的頁面, this.setupWebViewJavascriptBridge(function(bridge){
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
var responseData = { 'Javascript Says':'Right back atcha!' }
alert( data )
responseCallback(responseData)
};
1八、當數據多的時候可使用路由外面裹一層keep-alive,要加載router-view中,這樣再次進入這個路由的時候就不會從新加載了,好比進入頁面看到14行了,而後點擊進入下一個頁面,返回的時候直接定位是14行;
1九、原生js實現滾動到頂部
//document.body.scrollTop獲取chrome等瀏覽器的scrollTop,document.documentElement.scrollTop獲取IE瀏覽器的scrollTop
let x = document.body.scrollTop || document.documentElement.scrollTop;
let timer = setInterval(function(){
x = x - 10;
if( x < 100 )
{
x = 0;
window.scrollTo(x,x);
clearInterval(timer);
}
window.scrollTo( x, x );
},"10");
20、如何把build的項目在本地跑起來,把config下面的index.js中的assetsPublicPath的都改成./
2一、地址欄添加icon的時候由於是用的是webpack打包的因此這個icon要放在static文件下;
2二、如何給網站添加站標: 在線生成ico站標,通常是16*16,將製做好的站標命名爲favicon.ico,放在項目根目錄,而後在首頁的<head></head>標籤內添加
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="bookmark"href="/favicon.ico" />
2三、在自定義組件中使用這些受限制的元素時會致使一些問題,例如:
<table>
<my-row>...</my-row>
</table>
自定義組件 <my-row> 被認爲是無效的內容,所以在渲染的時候會致使錯誤。 變通的方案是使用特殊的 is 屬性:
<table>
<tr is="my-row"></tr>
</table>
2四、vue設置請求頭的時候:
Vue.http.interceptors.push((request, next) =>{
request.headers.set('loginCode', this.loginCode);
next((response) => {
return response
});
});
2五、插件開發: 聲明插件-> 寫插件-> 註冊插件 —> 使用插件
2六、Vue.mixin({//這裏的代碼會在每一個組件(包括根組件)的created執行以前 執行
created: function () {
console.log("組件開始加載")
}
}),也就是這個的代碼的執行循序是在created方法以前的;
2七、假如是寫給例如methods屬性的某個方法,組件裏若自己有test方法,並不會先執行插件的test方法,再執行組件的test方法,而是隻執行其中一個,而且優先執行組件自己的同名方法.這點須要注意
2八、想獲取子組件的值是經過自定義事件獲取的,子組件this.$emit(eventName, params),父組件監聽事件獲取參數v-on:eventName=eventName,eventName(params){console.log(params)},
附:
vue2.0相關文檔http://vuefe.cn/ 中文文檔http://vuejs.org/guide/ 官網原文文檔http://router.vuejs.org/zh-cn/index.html vue-router2.0中文文檔http://vuex.vuejs.org/en/index.html vuex2.0 英文文檔https://github.com/bhnddowinf/vuejs2-learn v2學習項目