天天看點

vue移動端心得

1、position:absolute: 定位的時候不同手機的浏覽器版本不一樣,存在相容性問題,是以要修改為fixed,然後使用left: calc(50% - 1rem )進行定位;

2、event.touches[0].pageY:移動端事件touchstart,touchmove,touchend,在vue中的手指滑動的對象是要傳入$event才可以使用event.touches[0].pageY等值;

3、傳回頂部:根據touchend事件判斷document.body.scrollTop的值是否大于1000來控制傳回頂部按鈕的顯示和隐藏;

4、彈窗定位: postion: absolute; left: 50%; top: 50%; margin-top: -height/2; margin-left: -width/2;

5、localstorage:存儲對象的時候存儲的是字元串JSON.stringify(),取的時候是對象( JSON.parse() );

6、@input: 實時監聽input中的值的時候,focus和blur都不能滿足需求的時候可以使用input事件;

7、分享元件: (1)<a href="http://service.weibo.com/share/share.php?appkey=&title=&url=&searchPic=false&style=simple" target="_blank" rel="external nofollow" target="_blank"><img src="/static/weibo.png" alt="wechat">分享到微網誌</a>;

8、左右滑動效果:的時候可以使用overflow-x:auto,但是在蘋果手機上會有問題,解決相容的方法是:-webkit-overflow-scrolling: touch;

9、移動端使用百度分享的時候: 

created(){

window._bd_share_main && window._bd_share_main.init()

},

mounted(){

window._bd_share_main && window._bd_share_main.init()

},

否則百度分享會出現點選兩次才出現分享按鈕,同時在index.html做出相應的配置;

10、異步渲染: 在vue項目中的有時候由于異步的原因導緻dom渲染問題,擷取不到對應的節點,在使用this.$nextTick無效的情況,可以使用 setTimeout等待dom加載完成之後執行函數,不過不推薦,會有性能問題;

11、移動端H5實作上傳圖檔:  http://javascript.ruanyifeng.com/htmlapi/file.html#toc0,推薦看一下這個,使用H5 API中的readAsDataURL,擷取圖檔傳回的base64編碼data-uri對象。,然後去請求背景的傳回圖檔路徑,在處理圖檔顯示的時候,會有兩種選擇: (1)不請求背景,直接渲染圖檔(2)base64請求背景,渲染圖檔,還有就是删除的時候要保持和資料庫同步;

12、移動端不支援select,自己div模拟select下拉效果;

13、請求傳參: 傳遞參數的時候是包含#的url的時候,背景可能不識别#,需要編碼的可以使用encodeURI(),encodeURIComponent();

14、Hybrid: 和原生互動的時候,給IOS傳遞參數的時候,使用 window.location.href = "next://";那麼IOS就可以接受到next這個參數;

15、導航鈎子:判斷離開一個路由的時候執行一個方法route1.beforeEach((to, from, next) => {

if( from.path == '/theme_detail' ){

console.log( 88888 )

}

next()

});

 export default route1

16、iphone5s不相容display:flex:處理方法: display:-webkit-flex;-webkit-box; flex:1; -webkit-flex: 1;-webkit-box-flex:1;

17、原生和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)

};

18、當資料多的時候可以使用路由外面裹一層keep-alive,要加載router-view中,這樣再次進入這個路由的時候就不會重新加載了,比如進入頁面看到14行了,然後點選進入下一個頁面,傳回的時候直接定位是14行;

19、原生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的都改為./

21、位址欄添加icon的時候因為是用的是webpack打包的是以這個icon要放在static檔案下;

22、如何給網站添加站标: 線上生成ico站标,一般是16*16,将制作好的站标命名為favicon.ico,放在項目根目錄,然後在首頁的<head></head>标簽内添加

<link rel="shortcut icon" href="/favicon.ico" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" />

<link rel="bookmark"href="/favicon.ico" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" />

23、在自定義元件中使用這些受限制的元素時會導緻一些問題,例如:

<table>

<my-row>...</my-row>

</table>

自定義元件 <my-row> 被認為是無效的内容,是以在渲染的時候會導緻錯誤。 變通的方案是使用特殊的 is 屬性:

<table>

<tr is="my-row"></tr>

</table>

24、vue設定請求頭的時候:

Vue.http.interceptors.push((request, next) =>{

request.headers.set('loginCode', this.loginCode);

next((response) => {

return response

});

});

25、插件開發: 聲明插件-> 寫插件-> 注冊插件 —> 使用插件

26、Vue.mixin({//這裡的代碼會在每個元件(包括根元件)的created執行之前 執行

created: function () {

console.log("元件開始加載")

}

}),也就是這個的代碼的執行循序是在created方法之前的;

27、假如是寫給例如methods屬性的某個方法,元件裡若本身有test方法,并不會先執行插件的test方法,再執行元件的test方法,而是隻執行其中一個,并且優先執行元件本身的同名方法.這點需要注意

28、想擷取子元件的值是通過自定義事件擷取的,子元件this.$emit(eventName, params),父元件監聽事件擷取參數v-on:eventName=eventName,eventName(params){console.log(params)},