微信小程序?qū)W習(xí)日志

每天的學(xué)習(xí)記錄饺藤,可能有的地方寫的不對,因為剛學(xué)流礁,以后發(fā)現(xiàn)錯的話會回來改掉
整體流程 https://developers.weixin.qq.com/miniprogram/dev/framework/config.html
基礎(chǔ)組件 https://developers.weixin.qq.com/miniprogram/dev/component/button.html
樣式可以到這里學(xué)http://www.w3school.com.cn/css/index.asp
http://www.runoob.com/cssref/pr-pos-clip.html
數(shù)據(jù)的操作
https://www.hishop.com.cn/xiaocx/show_36805.html

方法學(xué)習(xí)

簡單的提示

toast 和android的toast一樣涕俗,這里默認1500ms自動消失,也可以調(diào)用hiden消失

默認的icon是success也就是一個對號神帅,設(shè)置為none就只顯示文字了再姑。

        wx.showToast({
          title: 'login success',
          icon:'none'
          duration:1000
        })

loading 顯示一個loading,需要手動調(diào)用hidden消失

wx.showLoading({
  title: '加載中',
})

setTimeout(function(){
  wx.hideLoading()
},2000)

modal確認對話款

 wx.showModal({
      title: 'title',
      content: 'content',
      success: res => {
        if (res.confirm) {
          wx.showToast({
            title: 'click ok',
          })
        }else if(res.cancel){
          wx.showToast({
            title: 'click cancel',
          })
        }
      }
    })   
image.png

actionsheet 列表選擇器

代碼,如果列表數(shù)據(jù)要動態(tài)的找御,那這里引用一個變量即可元镀,你去修改變量這里自然也就變了。

        wx.showActionSheet({
          itemList: ['老大', '老二', '老三'],
          itemColor:"blue",
          success:function(res){
            wx.showToast({
              title: ''+res.tapIndex,
              icon:'none'
            })
          },
          fail:function(res){
             wx.showToast({
               title: 'cancel',
               icon:'loading'
             }) 
          }
        })

效果圖如下


image.png

大致瞅下demo的代碼

首先看下目錄結(jié)構(gòu)


image.png

從android開發(fā)者的角度來分析
每一個js文件就相當于一個activity霎桅,當然了不太準栖疑,里邊需要一個Page的東西的。
每一個js如果是一個頁面的話滔驶,那么就需要注冊才能用蔽挠,android是在manifest.xml里注冊,那么小程序是在哪里瓜浸?
在app.json里,如下圖,pages標簽下的都是比原。另外window屬性應(yīng)該是設(shè)置的頁面默認的屬性插佛,當然了是設(shè)置標題的主要

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs",
    "pages/learn/learn"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "icanseno",
    "navigationBarTextStyle":"black"
  }
}

app.js 看起來很像我們的application屋群。

.wxml 文件含懊,感覺就像我們android里的布局文件
.wxss文件逝钥,很像是樣式文件狈惫,對控件的屬性進行設(shè)置仪壮。比如設(shè)置寬高处面,位置斤斧,邊距等等
.json文件捂刺,很像我們manifest下每個activity下的配置文件冬殃,比如 label囚痴,theme那些。

頁面跳轉(zhuǎn)

url 后邊跟著跳轉(zhuǎn)頁面的路徑审葬,2個點自然是上一級了

 wx.navigateTo({
      url: '../learn/learn',
    })

設(shè)置點擊事件

bindtap 就是設(shè)置點擊事件的深滚,后邊起個名字奕谭。class就是一個樣式的名字,樣式在wxss里寫

<button bindtap='bindLoginTap' class='button-login'>login</button>

  //設(shè)置登陸點擊事件
bindLoginTap:function(){
//隨便干點啥
}

仿照已有的兩個頁面寫一個簡單頁面

image.png

learn.wxml文件如下,弄了2個輸入框痴荐,一個按鈕

<view class='container'>
<view class='login-edit'>
<input class='input-phone'></input>
<input class='input-password'></input>
<button bindtap='bindLoginTap' class='button-login'>login</button>
</view>
</view>

learn.wxss文件如下
還沒學(xué)規(guī)則血柳,就仿著寫,看他用的點加class名字生兆,我也這樣寫难捌。
不過這里碰到問題了,不知道距離這種單位咋區(qū)分的鸦难,我看demo里是rpx根吁,可px又啥啥,

.login-edit{
  display: flex;
  flex-direction:column;
  margin: 40rpx;
}

.input-phone{
background: red;
height: 50rpx;

}

.input-password{
  background: blue;
  height: 60rpx;
  margin-top: 20px;//這里20px看上去和60rpx差不多明刷,不知道單位咋算的婴栽,先放著
}

.button-login{
  margin-top: 50px;
  padding-left: 100px;
  padding-right: 100px;
}

本來計劃

https://developers.weixin.qq.com/miniprogram/dev/api/ui.html#wxsettopbartextobject
本來打算先學(xué)這些方法的,不過想想界面咋弄都還不會辈末,還是先去學(xué)咋畫界面吧

先學(xué)這個

https://developers.weixin.qq.com/miniprogram/dev/quickstart/basic/file.html#JSON-%E9%85%8D%E7%BD%AE

{{ }} 這樣的表達式

這個和占位符差不多愚争,里邊有個變量,這個變量改變以后這里對應(yīng)的值也就發(fā)生變化了挤聘,如果學(xué)過databinding的話估計好理解一些轰枝。
如下

//wxml文件里有如下的文本
<text class='login-text'>{{logintip}}</text>

//js里,初始化的時候賦值為login
 /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {
    logintip:'login'
  },
//比如點擊登錄按鈕我們改變這個字段组去,可以看到我們修改了logintip的值以后鞍陨,文本顯示的內(nèi)容自動就修改了
  //處理登陸點擊事件
bindLoginTap:function(){
this.setData({
  logintip:'點擊登錄了'
})
},

this的使用

上邊的this沒啥問題,可以找到setData方法从隆,可如果我們再套一層诚撵,如下

  onPullDownRefresh: function () {
    this.setData({
      logintip: '登錄'
    })
    setTimeout(function(){
     
     //在這里用this.setData就不行了,這個this已經(jīng)不是我們要的那個this拉
      
    },2222)
  },

有兩種方法键闺,
第一種寿烟,用個臨時變量保存下這個this

  onPullDownRefresh: function () {
     var temp=this;//賦值給一個臨時變量
    setTimeout(function(){
      temp.setData({
        logintip: '登錄'
      })
      wx.stopPullDownRefresh()
      
    },2222)
  },

第二種,就像lamda表達式吧

  onPullDownRefresh: function(){
   //這里修改下,function(參數(shù))改成參數(shù)=》這種辛燥,因為沒有參數(shù)筛武,所以用any代替
    setTimeout(any=>{
      this.setData({
        logintip: '登錄'
      })
      wx.stopPullDownRefresh()
      
    },2222)
  },

頁面下json數(shù)據(jù)的設(shè)置

好像不支持雙斜杠注釋,編譯的時候會一直提示掛了挎塌。徘六。

{
  "navigationBarTitleText": "第一個練習(xí)界面",//導(dǎo)航欄標題文字內(nèi)容
  "navigationBarBackgroundColor": "#ff0000",//導(dǎo)航欄標題顏色,僅支持 black/white
  "navigationBarTextStyle": "white",//導(dǎo)航欄背景顏色
  "enablePullDownRefresh": true,//是否開啟下拉刷新
  "backgroundColor": "#ffffff",//窗口的背景色
  "backgroundTextStyle": "dark",//下拉 loading 的樣式榴都,僅支持 dark/light
  "onReachBottomDistance":20,//頁面上拉觸底事件觸發(fā)時距頁面底部距離待锈,單位為px
  "disableScroll":true //設(shè)置為 true 則頁面整體不能上下滾動;只在 page.json 中有效
}
//最后兩個屬性沒有提示嘴高,比較坑炉擅,還得手動寫辉懒。 另外上邊是目前所有的頁面的配置屬性了,單獨頁面只能配置window屬性用來覆蓋app.json下的window屬性

app.json的

完整的如下,tabbar不是必須的谍失,還有坑眶俩。

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs",
    "pages/learn/learn",
    "pages/justtest/test"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "icanseno",
    "navigationBarTextStyle":"black"
  },
  "networkTimeout": {
    "request": 20000,
    "connectSocket": 20000,
    "uploadFile": 20000,
    "downloadFile": 20000
  },
  "debug": true
,
"tabBar": {
"color": "#000000",
    "selectedColor":"#ff0000",
    "backgroundColor":"#ffffff",
    "borderStyle":"black",
    "position":"bottom",
  "list": [
    {
      "pagePath": "pages/index/index",
      "text": "test",
      "iconPath": "res/all.png",
      "selectedIconPath": "res/all_select.png"
    },
    {
      "pagePath": "pages/learn/learn",
      "text": "first",
      "iconPath": "res/set.png",
      "selectedIconPath": "res/set_select.png"
    }
  ]
}

}

image.png

我看這里有個tabbar,我也加上了快鱼,完事發(fā)現(xiàn)這東西也不顯示啊颠印。而且咋顯示啊,然后就想到了抹竹,小程序的第一個頁面是在哪里設(shè)置的线罕?
就是pages列表下的第一個,誰放到第一個誰就是啟動頁窃判。
那么問題來了tabbar咋辦钞楼?tabbar要顯示成啟動頁,那么它的list下的第一個pagepath就必須和pages列表下的第一個一樣袄琳。

而且發(fā)現(xiàn)询件,tabbar里的這些頁面,無法在通過其他地方進入了唆樊。比如上邊的宛琅,我把learn也放到了tabbar,
其他地方我有個按鈕點擊也跳到learn頁面逗旁,如下嘿辟,結(jié)果沒反應(yīng),剛學(xué)片效,也不知道對不對红伦,先這樣吧
wx.navigateTo({
url: '../learn/learn',
})

image 以及循環(huán)添加控件

https://developers.weixin.qq.com/miniprogram/dev/component/image.html

默認數(shù)組的當前項的下標變量名為 index,數(shù)組當前項的變量名默認為 item
如果想改名字淀衣,可以這樣寫wx:for-item="itemData" wx:for-index="i"
https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/list.html

  <view>
    <text wx:if="{{isWaiting}}">等待加載數(shù)據(jù)..</text>
    <block wx:else>
      <image mode='aspectFit' style='width:100px; height:100px;background-color: #ff0000;' src='../../res/all.png'></image>
      <view wx:for="{{array}}" wx:for-item="itemData" wx:for-index="i">
        <view>{{itemData.index}}</view>
        <button>{{itemData.name}}</button>
      </view>
    </block>
  </view>

學(xué)習(xí)下wx:if wx:else 的用法
{{}}占位符色建,在標簽里邊一般得加個雙引號的。
wx:for= 后邊跟個數(shù)組舌缤,wx:for-item= 后邊給循環(huán)的數(shù)據(jù)起個別名,后邊用到
{{itemData.index}}就是根據(jù)上邊的item的名字來獲取數(shù)據(jù)的
我們在js的data數(shù)據(jù)里添加如下的數(shù)組

    array:[{
          index:0,
          name:'大哥'
    },
      {
        index: 1,
        name: '二哥'
      },
      {
        index: 2,
        name: '三哥'
      }
    ]

wx: 這玩意也不提示某残,用起來不爽

checkbox

默認是選中狀態(tài)国撵,"{{false}}" 這種有效,直接弄個單引號false是無效的玻墅。

<checkbox checked="{{false}}">{{"checkbox"+number}}</checkbox>

<button type="{{ck?'warn':'default'}}"
代碼里動態(tài)修改ck的值介牙,可以改變button的type。

動態(tài)改變數(shù)組里的數(shù)據(jù)

從這里看到的https://blog.csdn.net/JaRiS_jade/article/details/79269233

  data: {
    array:[{
          index:0,
          name:'大哥',
          check:false
    },
      {
        index: 1,
        name: '二哥',
        check: false
      }
    ]
  }

點擊按鈕修改
雙引號括起來代表變量澳厢,0是數(shù)組索引环础,這里修改的是第一個囚似。

btnclick0: function (res) {
    this.setData({
      "array[0].check" : true
    })
  }

第二種寫法,用一個變量保存,不過使用的時候變量要加個中括號代表是變量

  btnclick0: function (res) {
    var hello = "array[0].check"
    this.setData({
      [hello]:true
    })
  }

數(shù)組列表設(shè)置點擊事件

注意data-any (any任意類型) 方法线得,我們這里注入了一個id等于數(shù)據(jù)的index索引饶唤。
下邊弄了2個 data-id 和 data-check

<view bindtap="arrayclick" wx:for="{{array}}" wx:key="index" >
        <view>{{item.index}} {{index}}</view>
        <button  type="{{item.check?'warn':'default'}}" data-id="{{index}}" data-check="{{item.check}}" bindtap='itemclick'>{{item.name}}</button>
      </view>

把點擊事件寫到外層也是可以的,如下

 <view  wx:for="{{array}}" wx:key="index"  data-id="{{index}}" data-check="{{item.check}}" bindtap='itemclick'>
        <view>{{item.index}} {{index}}</view>
        <button  type="{{item.check?'warn':'default'}}" >{{item.name}}</button>
      </view>

js里這樣寫

//res.currentTarget.dataset保存所有的data-的數(shù)據(jù)
  itemclick:function(res){
    var id=res.currentTarget.dataset.id
    var ck = res.currentTarget.dataset.check
   
    var temp = "array[" + id + "].check"
    // var state=this.data.array[id].check
    // console.log("change============="+!state)
    this.setData({
      [temp]:!ck
    })
  }

單選設(shè)置

原理就是在js里定義一個clickindex的變量保存當前選中的item的index贯钩,完事代碼如下
我這里比較簡單募狂,就修改type, 按鈕默認就是灰色的角雷,warn是紅色的祸穷,注意 ‘warn’單引號,其他效果的話邏輯是一樣的勺三。

  <view class="single_choice_views">
    <view bindtap="singleclick" wx:for="{{array2}}" wx:key="index" data-id="{{index}}">
      <button type="{{item.index==clickindex?'warn':'default'}}">{{item.name}}</button>
    </view>
  </view>

js代碼

 data: {
    clickindex:0,
//省略其他 雷滚,點擊按鈕以后修改clickindex為點擊的按鈕的index即可。
  singleclick:function(res){
    var id=res.currentTarget.dataset.id
    this.setData({
      clickindex:id
    })
  }

控件的隱藏和顯示

第一種吗坚,設(shè)置他的display屬性為none祈远,這種的結(jié)果就相當于gone,不占位置
第二種刻蚯,設(shè)置visibility=hidden绊含,這種相當于invisible,只是看不到炊汹,但還占著位置

<button  style='visibility:hidden'>preview images</button>
  <button  style='display:none'>preview images2</button>

動態(tài)改變可以這樣寫躬充,其中state是個數(shù)字,可以是0,1,2
注意讨便,外邊雙引號充甚,里邊單引號

<button style="visibility:{{state==0?'visible':'hidden'}}">preview images</button>
<button  style="display:{{state==0?'none':'flex'}}">preview images2</button>

當然了,你也可以使用不同的樣式來處理

<view class="view_stop_hidden{{state!=0?'view_stop_show':''}}">
    <button bindtap='tapstoprecord' >stop record</button>
  </view>
//或者
<view class="{{state==0?'view_stop_hidden':'view_stop_show'}}"></view>

wxss文件里

.view_stop_hidden{
  display: none;

}
.view_stop_show{
  display: flex;
}

說一下自己的理解霸褒,感覺wxss里的屬性都可以寫到wxml了伴找,添加到style屬性里即可
比如
style='display:none;visibility:visible;width:100wpx;height:100wpx'

選擇本地圖片

https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html#wxchooseimageobject
返回一個文件集合
res.tempFilePaths 里邊是文件路徑的數(shù)組
res.tempFiles 返回的是一個File數(shù)組, path是路徑废菱,size是文件大小技矮,

wx.chooseImage({
      count: 1, //默認9張
      sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有
      sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機殊轴,默認二者都有
      success: function(res) {
        
        console.log("file===========" + res.tempFilePaths + "===" + res.tempFilePaths.length+"==="+
          res.tempFiles[0].path + "====" + res.tempFiles[0].size)
      },
    })

圖片預(yù)覽

urls里傳一堆網(wǎng)絡(luò)圖片地址衰倦,current傳你默認要顯示哪一張的圖片地址,不傳的話默認就是顯示urls里的第一張圖旁理,圖片可左右滑動

  wx.previewImage({
      urls: ['https://xxx', 'https://xxx'
      ],
      current: '', // 當前顯示圖片的http鏈接
    })

錄音

簡單測試下樊零,2個按鈕,
第一個按鈕點擊開始后孽文,可暫停驻襟,可繼續(xù)夺艰。
操作沒問題,臺式機沒麥克風沉衣,返回錯誤了郁副,沒法測試,等換手機測試再看一下
operateRecorder:fail DevicesNotFoundError

 tapstartrecord: function() {
    var recorderManager=wx.getRecorderManager()
    if(this.data.state==0){
      recorderManager.onStart(() => {
        console.log('recorder start')
      })
      recorderManager.onPause(() => {
        console.log('recorder pause')
      })
      recorderManager.onStop((res) => {
        console.log('recorder stop', res)
        const { tempFilePath } = res
      })
      recorderManager.onFrameRecorded((res) => {
        const { frameBuffer } = res
        console.log('frameBuffer.byteLength', frameBuffer.byteLength)
        var fs=frameBuffer.byteLength/1024
        var show=fs+"K"
        if(fs/1024>0){
            show=fs/1024+"M"
        }
        this.setData({
          filesize:show
        })
      })

recorderManager.onError((res)=>{
        console.log("onError=================" + res.errMsg)
      })
      const options = {
        duration: 60000,
        sampleRate: 44100,
        numberOfChannels: 1,
        encodeBitRate: 192000,
        format: 'mp3',
        frameSize: 50
      }
      recorderManager.start(options)
      this.setData({
        state:1
      })
    }else if(this.data.state==1){
      recorderManager.pause
      this.setData({
        state:2
      })
    }else {
      recorderManager.resume
      this.setData({
        state: 1
      })
    }
   
  },
  tapstoprecord: function() {
    if(this.data.state==0){
      return
    }
    var recorderManager = wx.getRecorderManager()
    recorderManager.stop
    this.setData({
      state: 0
    })
  }

display

看到這個屬性就順道學(xué)習(xí)下
https://blog.csdn.net/u013673799/article/details/70157294

.root_view{
  display: flex;
  flex-direction: column;
  height: 100%;
  background-color: #b99a9ab7
}

flex-direction 默認是row也就是水平的厢蒜,column是垂直的霞势,還有2種帶reverse的,就和android里的rtl一樣斑鸦,從右邊或者下邊開始排列愕贡。
flex-wrap 3種可選
nowrap(不換行,默認值)
wrap(換行)
wrap-reverse(與wrap的效果相反)

.view_text{
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

display:block
block表示[塊內(nèi)]容器模式巷屿,總是使用新行開始顯示固以,小程序的3個視圖容器(view,srcoll-view嘱巾,swiper)默認值均為display:block

結(jié)果

<view class='root_view'>
  <button bindtap='tapchooseimage'>choose image</button>
  <button bindtap='tappreviewimage' >preview images</button>
  
  <button bindtap='tapstartrecord'>{{states[state]}}</button>
  <view class="view_stop_hidden{{state!=0?'view_stop_show':''}}">
    <button bindtap='tapstoprecord' >stop record</button>
    <view>錄音文件信息</view>
    <text>{{filesize}}</text>
  </view>
 
 <view class='view_text'>
 <rich-text class='view_text1'>text1</rich-text>
 <rich-text class='view_text2'>text2</rich-text>
 <rich-text class='view_text3'>text3</rich-text>
 </view>
</view>

wxss

.root_view{
  display: flex;
  flex-direction: column;
  
  height: 100%;
  background-color: #b99a9ab7
}
.view_stop_hidden{
  display: none;

}
.view_stop_show{
  display: block;
}
.view_text1{
  background: #ff0000;
  width: 100rpx;
  height: 50px;
}

flex 憨琳,column的情況下,發(fā)現(xiàn)上邊3個按鈕是居中顯示的旬昭,而且寬度都是wrap的篙螟。
可下邊那個隱藏按鈕顯示出來的 時候?qū)挾仁莔atch_parent的。
分析一下應(yīng)該是display=block的原因

display:block

這種情況下问拘,子控件如果設(shè)置固定寬度遍略,那就顯示固定寬度,如果沒有設(shè)置寬度骤坐,那么默認和屏幕寬度一樣绪杏,另外子view每行就一個,
感覺block一設(shè)置纽绍,子view的有的屬性咋就無效了蕾久。待研究。拌夏。僧著。。障簿。盹愚。。卷谈。。霞篡。世蔗。端逼。。

gravity設(shè)置

align-items: center; justify-items: center;
align和justify的到底是水平還是垂直方向起作用污淋,感覺是和view的flex-direction有關(guān)系的顶滩,
不知道哪里不對,感覺除了center其他都沒效果寸爆。礁鲁。。赁豆。仅醇。。魔种。析二。。节预。

--------------------------------------20180808學(xué)習(xí)----------------------------------------

測試

.view_text{
  display: flex;
  height: 200px;
 
  flex-direction: column;
  align-items: center;//使得水平方向居中
  justify-content: center;//使得垂直方向居中
  background: #d6a0a0;
}
image.png

然后看著不爽叶摄,想把text文字居中,可咋看都不居中啊安拟。搜了好幾個帖子都沒效果蛤吓,最后看到百度一個帖子

text是行內(nèi)元素 不能用text-align,你把text標簽改成view 或者把text設(shè)置display:block.
補充下 因為行內(nèi)元素長度隨內(nèi)容變化,所以他不能讓你在一行的中間糠赦,因為他的長度就是文字長度会傲。

先看下wxml文件,最早都是text,先把最后一個改成view測試

  <view class='view_text'>
    <rich-text class='view_text1'>text1</rich-text>
    <text class='view_text2'>text2</text>
    <view class='view_text3'>text3</view>
  </view>

wxss代碼

.view_text2{
  display: block;
  background: #00ff00;
 text-align: center;
 
  width: 150rpx;
  height: 50px;
}
.view_text3{
  display: flex;
  flex-direction: column;
  background: #2600ff;
  align-items: center;
  justify-content: center;
  width: 150rpx;
  height: 50px;
}

結(jié)果如下圖愉棱,只有最后一個可以做到完全居中唆铐,第二個只能做到水平居中。
目前就這樣奔滑,等以后知道咋弄再來修改代碼艾岂。。朋其。


image.png

template 模板

https://developers.weixin.qq.com/miniprogram/en/dev/framework/view/wxml/template.html?search-key=template

image.png

上圖的wxml文件中有如下的代碼

<!--右側(cè)有箭頭  -->
<template name="list">
  <view class="tui-youjiantou">
    <navigator url="{{item.url}}">
      <block>
        <text>{{item.title}}</text>
      </block>
    </navigator>
  </view>
</template>

下邊的代碼就引用了上邊的模板王浴,另外下邊的代碼里也在自身定義了2個簡單的模板

<import src="../../template/simpletp" />

<template name='test1'>
  <view>header test</view>
</template>
<template name='test2'>
  <view>{{item}}</view>
</template>


<scroll-view style="height:100%;" scroll-y="true">
<view>
  <template is='test1' /> just test
  <view wx:for="{{['a','b','c','d']}}">
    <template is="test2"   data="{{item}}"  />
  </view>

</view>
  <template wx:for="{{days}}" is="list" data="{{item}}"></template>
</scroll-view>

簡單的就是 template標簽后邊跟個name,里邊要寫啥看自己需求了梅猿。
這個可以寫在當前正在用的wxml文件里氓辣,也可以寫在單獨的wxml文件了,別處調(diào)用袱蚓。
還是建議寫到單獨的wxml文件里钞啸,因為模板肯定是多出調(diào)用才叫模板啊架谎。找的時候也方便找。
<template name='test1'>
<view>header test</view>
</template>
一般都這樣弄個文件夾把模板文件寫到里邊渴析,如下圖


image.png

引用外部模板的2步

其他地方使用的時候需要import導(dǎo)入箱玷,后邊src跟路徑
<import src="../../template/simpletp" /> 此代碼放在需要模板的wxml文件里。
另外絮吵,如果模板有樣式的話弧烤,那么在引用模板的wxss文件里也需要添加引用
@import "../../template/simpletp.wxss";

使用的時候也簡單,如下template標簽蹬敲,后邊 is跟上模板的name暇昂。如果要傳遞數(shù)據(jù) 用data
模板擁有自己的作用域,只能使用 data 傳入的數(shù)據(jù)以及模版定義文件中定義的 <wxs /> 模塊伴嗡。
<template is="test2" data="{{item}}" />
for循環(huán)的話有2種寫法都可以,可以直接在模板上for循環(huán)急波,也可以在外層for循環(huán)

<view wx:for="{{['a','b','c','d']}}">
    <template is="test2"   data="{{item}}"  />
  </view>

 <template wx:for="{{days}}" is="list" data="{{item}}"/>

for循環(huán)給模板傳多條數(shù)據(jù)咋辦

我們除了item要傳過去,index也要傳過去咋辦闹究?
data里邊是可以寫key:value的鍵值對的幔崖,多個數(shù)據(jù)逗號隔開,如下渣淤,我們把index和item都傳過去了赏寇。如果你想加其他的也沒問題,再加上一個key:value即可价认。

<template name='test2'>
  <view>{{content}}&&{{index}}</view>
</template>

  <view wx:for="{{['a','b','c','d']}}">
    <template is="test2"   data="{{content:item,index:index}}"  />
  </view>

以前沒注意嗅定,今天測試才發(fā)現(xiàn),模板里變量的名字用踩,需要和使用模板的地方傳的數(shù)據(jù)的名字一樣渠退。
如下舉例,2個xxx的地方名字要一樣的。

<template name='test2'>
  <view>{{xxx}}</view>
</template>

//使用
<template  data="{{xxx}}"></template>

模塊

https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxs/01wxs-module.html
每一個 .wxs 文件和 <wxs> 標簽都是一個單獨的模塊
方便測試脐彩,同級目錄下新加個文件test3.wxs

var a="i come from a test wxs file"
var b="bbbb"
var change=function(b){
  return b+"...changed"
}
//只有exports的東西其他地方才可以使用,比如上邊的變量b碎乃,外界是找不到的
exports: 通過該屬性,可以對外共享本模塊的私有變量與函數(shù)惠奸。
module.exports={
  aaaa:a, //可以改名字
  change:change
}
module.exports.message='message.............'

如何使用

<wxs src="test3.wxs" module="mtools"/>  //src指向文件路徑梅誓, module 起個名字,下邊用到

{{mtools.aaaa}}
<view>{{mtools.change(mtools.message)}}</view>

也可以直接添加wxs標簽佛南,就寫在wxml文件里

 {{mlocal.hello}}
    {{mlocal.getsize("yes")}}

<wxs module="mlocal">
  var hello = "hello world"
  var getsize = function(char) {
    return char.length
  }

  module.exports = {
    hello: hello,
    getsize: getsize,
  }
</wxs>

一個wxs文件可以引用另一個的梗掰,如下使用require方法,參數(shù)傳相對路徑即可

var a="i come from a test wxs file"

var tt=require("other.wxs")
console.log("==============1111"+tt.hello)

module.exports={
  aaaa:a,

}

運算符

基礎(chǔ)運算符嗅回,自增及穗,自減,亦或绵载,位運算埂陆,比較苛白,等值
這幾個不知道啥,

var a = 10, b = 20;

// delete 運算
console.log(true === delete a.fake);
// void 運算
console.log(undefined === void a);
// typeof 運算
console.log("number" === typeof a);

參數(shù)

如下焚虱,方法定義的時候function后邊是沒有寫參數(shù)的丸氛,可使用的時候可以傳N個參數(shù)。

var a = function(){
    console.log(3 === arguments.length);
    console.log(100 === arguments[0]);
    console.log(200 === arguments[1]);
    console.log(300 === arguments[2]);
};
a(100,200,300);

//這樣也行
var change=function(b){
  return b+"...changed"
}
change("aaa",3,4)//只有第一個有用

尺寸單位

rpx(responsive pixel): 可以根據(jù)屏幕寬度進行自適應(yīng)著摔。規(guī)定屏幕寬為750rpx。如在 iPhone6 上定续,屏幕寬度為375px谍咆,共有750個物理像素,則750rpx = 375px = 750物理像素私股,1rpx = 0.5px = 1物理像素摹察。
樣式導(dǎo)入

/** common.wxss **/
.small-p {
  padding:5px;
}
/** app.wxss **/
@import "common.wxss";
.middle-p {
  padding:15px;
}

全局樣式與局部樣式

定義在 app.wxss 中的樣式為全局樣式,作用于每一個頁面倡鲸。在 page 的 wxss 文件中定義的樣式為局部樣式供嚎,只作用在對應(yīng)的頁面,并會覆蓋 app.wxss 中相同的選擇器峭状。

-------------------20180809---------------------------------

wxss樣式

image.png

微信這文檔太簡單了克滴。完事看下他提供的demo,里邊樣式一堆都看不懂优床。
這種中間帶個空格的也沒看到介紹劝赔。等我研究下。好像多個樣式就是用空格的胆敞。
<view class="flex-item bc_green">1</view>

下劃線和刪除線


image.png

text-decoration: underline;
text-decoration:line-through;

scroll-view標簽

https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html
測試代碼如下

<view>
<scroll-view scroll-y style='height:200px;' bindscrolltoupper="upper" bindscrolltolower="lower" bindscroll="scroll" scroll-with-animation="{{true}}"
 scroll-into-view="{{toview}}" scroll-top="{{scrollTop}}">
  垂直滾動着帽,高度200
   <view id="text1" style="height:150px; background:#ff0000; color:#ffffff;">text1</view>
  <view id="text2" style='height:150px; background:#0000ff; color:#ffffff;'>text2</view>
</scroll-view>
<button bindtap='gotext1' style='margin-top:30px'>go text1</button>
<button bindtap='gobottom'>go bottom</button>
<button bindtap='gotop'>go top</button>
<button bindtap='scroll20'>scrollTop 10</button>
</view>

效果圖如下,圈圈里的就是scroll-view


image.png

scroll-into-view 后邊跟一個view的id移层,滾動到哪個view就設(shè)置哪個仍翰;
scroll-y 表示垂直方向移動,對應(yīng)的scroll-x 水平的
scroll-with-animation 滾動的時候是否帶動畫
scroll-top 滾動到某個位置观话,
bindscrolltoupper 監(jiān)聽往上滾動予借,或者往左滾動
bindscrolltolower 監(jiān)聽往下滾動,或者往右滾動
bindscroll 監(jiān)聽滾動

寫在最后匪燕,小程序的文檔就是個坑貨

寫的簡單蕾羊,也不全。結(jié)果想寫個水平的scrollview咋都不行帽驯,只好百度 https://www.cnblogs.com/Anne3/p/7053643.html
找到別人寫的樣式才可以龟再。

<scroll-view scroll-x style="width: 100%;white-space: nowrap;"> 
    <button bindtap='gotext1' class="btn_width" >go text1</button>
  <button bindtap='gobottom' class="btn_width">go bottom</button>
  <button bindtap='gotop' class="btn_width">go top</button>
  <button bindtap='scroll20' class="btn_width">scrollTop 10</button>
  </scroll-view>

//樣式
.btn_width{
  width: 100px;
  display: inline-block;
}

主要的兩點,scrollview需要white-space: nowrap;屬性尼变,要不控件多了自動換行了利凑,沒法滾浆劲,
子控件需要 display: inline-block;

swiper 就是我們常說的banner圖

https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html

image.png

<swiper indicator-dots="{{true}}" indicator-color='#ff0000' indicator-active-color='#0000ff' autoplay="{{true}}" current='0' interval='5000' vertical="{{false}}" previous-margin='5px' next-margin='5px' display-multiple-items='1' bindchange='swiperchange'>
    <block wx:for="{{imgUrls}}">
      <swiper-item>
        <image src="{{item}}" class="slide-image" width="355" height="150" />
      </swiper-item>
    </block>
  </swiper>


    imgUrls: [
      'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg',
      'http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg',
      'http://img06.tooopen.com/images/20160818/tooopen_sy_175833047715.jpg'
    ],


swiperchange:function(event){
    //source===autoplay or touch
  console.log("swiper change======"+event.detail.current+"==============="+event.detail.source)
}

movable-view 可移動的

https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.html

<movable-area style="width:100%;" scale-area>
  <movable-view direction="all" inertia out-of-bounds scale="{{true}}">
  movable view 
  <view style="width:200px;height:300px;background:#ff0000;color:#ffffff;">place holder</view>
  </movable-view>
</movable-area>

icon

image.png

progress

<progress percent='30' show-info stroke-width="12" color="#215980" active style='width:100%'/>

checkbox checkbox-group

文檔又是個坑,效果圖是垂直的哀澈,可又不告訴你咋垂直牌借,又得百度搜
https://blog.csdn.net/wangshop_11/article/details/54236745
lable包裹的話用style='display:flex'
下邊這個checkbox標簽里沒有設(shè)置值,相反在前邊弄了個值割按,因為默認的checkbox文字在右邊的膨报,這里是左邊的效果

<view>
  <checkbox-group bindchange="checkboxChange">
    <label style='display:flex;padding-left:10px' wx:for="{{items}}" wx:key="name">
      {{item.value}}
      <checkbox style="margin-left:10px" value="{{item.value}}" color='#215980' checked="{{item.checked}}"></checkbox>
    </label>
  </checkbox-group>
</view>

view包裹的話用style="flex-direction:column;

<checkbox-group  bindchange="checkboxChange">
  <view style="flex-direction:column;" wx:for="{{items}}">
    <checkbox value="{{item.name}}" checked="{{item.checked}}">{{item.value}}</checkbox>
  </view>
</checkbox-group>

form表單

<form bindsubmit="formSubmit" bindreset="formReset"> 
<switch name="switch"/>

<slider name="slider" show-value ></slider>

<input name="desc" placeholder='input some thing'></input>
checkbox
<checkbox-group name="cg-country">
<checkbox value="TA" >thai</checkbox>
<checkbox value="CN" >china</checkbox>
<view>
radio 
</view>
</checkbox-group>

    <radio-group name="radio-group">
      <label><radio value="radio1"/>radio1</label>
      <label><radio value="radio2"/>radio2</label>
    </radio-group>

      <view class="btn-area">
    <button formType="submit">Submit</button>
    <button formType="reset">Reset</button>
  </view>
  點擊按鈕結(jié)果:{{show}}
</form>
image.png
  formSubmit: function (e) {
    console.log('form發(fā)生了submit事件,攜帶數(shù)據(jù)為:', e.detail.value)
    this.setData({
      show: JSON.stringify(e.detail.value)
    })
  },
  formReset: function () {
    console.log('form發(fā)生了reset事件')
    this.setData({
      show: 'reset.........'
    })
  },

-------------------------20180810----------------------

picker選擇器

1-普通選擇器适荣,就一列mode = selector默認的就是這個

image.png
<view>普通選擇器现柠,結(jié)果是:{{array[index]}}</view>
<picker range="{{array}}" value="{{index}}" bindchange='bindPickerChange'>click </picker>

<view>普通選擇器2,結(jié)果是:{{array[index]}}</view>
<picker range="{{objectArray}}" range-key='name' value="{{index}}" bindchange='bindPickerChange'>click </picker>

range 后邊跟一個數(shù)組弛矛,如果數(shù)組里是對象的話够吩,那么需要range-key來指定列表顯示哪個字段
value是要顯示哪個的index
bindchange 事件返回的也是index
如下js

    array: ['美國', '中國', '巴西', '日本'],
    objectArray: [
      {
        id: 0,
        name: '美國'
      },
      {
        id: 1,
        name: '中國'
      },
      {
        id: 2,
        name: '巴西'
      },
      {
        id: 3,
        name: '日本'
      }
    ],
    index: 0,

  bindPickerChange: function (e) {
    console.log('picker發(fā)送選擇改變,攜帶值為', e.detail.value)
    this.setData({
      index: e.detail.value
    })
  },

2~多列選擇器 mode='multiSelector'

image.png
<view>多列選擇丈氓,結(jié)果:{{multiArray[0][multiIndex[0]]}}周循,{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}}</view>
<picker mode='multiSelector' bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">click </picker>

value 是個數(shù)組保存每列的下角標 multiIndex: [0, 0, 0]万俗;
bindchange==value 改變時觸發(fā) change 事件湾笛,event.detail = {value: value}
bindcolumnchange==某一列的值改變時觸發(fā) columnchange 事件,event.detail = {column: column, value: value}闰歪,column 的值表示改變了第幾列(下標從0開始)迄本,value 的值表示變更值的下標

js,上邊wxml里用的是multiArray,如果用objectMultiArray课竣,那么就需要指定range-key=‘name’

multiArray: [['無脊柱動物', '脊柱動物'], ['扁性動物', '線形動物', '環(huán)節(jié)動物', '軟體動物', '節(jié)肢動物'], ['豬肉絳蟲', '吸血蟲']],
    objectMultiArray: [
      [
        {
          id: 0,
          name: '無脊柱動物'
        },
        {
          id: 1,
          name: '脊柱動物'
        }
      ], [
        {
          id: 0,
          name: '扁性動物'
        },
        {
          id: 1,
          name: '線形動物'
        },
        {
          id: 2,
          name: '環(huán)節(jié)動物'
        },
        {
          id: 3,
          name: '軟體動物'
        },
        {
          id: 3,
          name: '節(jié)肢動物'
        }
      ], [
        {
          id: 0,
          name: '豬肉絳蟲'
        },
        {
          id: 1,
          name: '吸血蟲'
        }
      ]
    ],
    multiIndex: [0, 0, 0],

這個時候數(shù)據(jù)是不完整的嘉赎,如果切換脊椎動物,那么數(shù)據(jù)哪來于樟?看下邊
不過這個列子好像有問題公条,這樣寫,就算點取消那么數(shù)據(jù)也發(fā)生變化了迂曲。

  bindMultiPickerChange: function (e) {
    console.log('picker發(fā)送選擇改變靶橱,攜帶值為', e.detail.value)
    this.setData({
      multiIndex: e.detail.value
    })
  },
  bindMultiPickerColumnChange: function (e) {
    console.log('修改的列為', e.detail.column, ',值為', e.detail.value);
    var data = {
      multiArray: this.data.multiArray,
      multiIndex: this.data.multiIndex
    };
    data.multiIndex[e.detail.column] = e.detail.value;
    switch (e.detail.column) {
      case 0:
        switch (data.multiIndex[0]) {
          case 0:
            data.multiArray[1] = ['扁性動物', '線形動物', '環(huán)節(jié)動物', '軟體動物', '節(jié)肢動物'];
            data.multiArray[2] = ['豬肉絳蟲', '吸血蟲'];
            break;
          case 1:
            data.multiArray[1] = ['魚', '兩棲動物', '爬行動物'];
            data.multiArray[2] = ['鯽魚', '帶魚'];
            break;
        }
        data.multiIndex[1] = 0;
        data.multiIndex[2] = 0;
        break;
      case 1:
        switch (data.multiIndex[0]) {
          case 0:
            switch (data.multiIndex[1]) {
              case 0:
                data.multiArray[2] = ['豬肉絳蟲', '吸血蟲'];
                break;
              case 1:
                data.multiArray[2] = ['蛔蟲'];
                break;
              case 2:
                data.multiArray[2] = ['螞蟻', '螞蟥'];
                break;
              case 3:
                data.multiArray[2] = ['河蚌', '蝸牛', '蛞蝓'];
                break;
              case 4:
                data.multiArray[2] = ['昆蟲', '甲殼動物', '蛛形動物', '多足動物'];
                break;
            }
            break;
          case 1:
            switch (data.multiIndex[1]) {
              case 0:
                data.multiArray[2] = ['鯽魚', '帶魚'];
                break;
              case 1:
                data.multiArray[2] = ['青蛙', '娃娃魚'];
                break;
              case 2:
                data.multiArray[2] = ['蜥蜴', '龜', '壁虎'];
                break;
            }
            break;
        }
        data.multiIndex[2] = 0;
        console.log(data.multiIndex);
        break;
    }
    this.setData(data);
  },

3~時間選擇mode='time'

image.png
<view>時間選擇路捧,結(jié)果:{{time}}</view>
<picker mode='time' value="{{time}}" start="09:01" end="21:01" bindchange="bindTimeChange">click </picker>

value 就是一個具體的時間关霸,格式"hh:mm"
start ,end分別限制時間的范圍
bindchange的方法里杰扫,返回的就是具體的時間

  bindTimeChange: function (e) {
    console.log('picker發(fā)送選擇改變队寇,攜帶值為', e.detail.value)
    this.setData({
      time: e.detail.value  //攜帶值為 21:01
    })
  },

4~日期選擇 mode='date'

image.png
<view>日期選擇,結(jié)果:{{date}}</view>
<picker mode='date' value="{{date}}" start='2015-02-12' end='2018-12-12'  bindchange="bindDateChange" >click </picker>

value就是選中的日期 格式就是"YYYY-MM-DD"
bindechange 方法返回的也是具體的日期 章姓,如2016-09-01

年月日是可選的佳遣,如果你只要年识埋,增加屬性fields="year",如果只要年月,那么增加屬性fields="month" 零渐,
默認值是fileds='day' 也就是3個都顯示窒舟。
ps:測試了一下,wx提供的這東西诵盼,對于day并沒有做處理惠豺,它顯示的都是31天,不過比如3月可以選31风宁,你切換到4月耕腾,然后選擇31,它就自動滾回1號了杀糯。模擬器的效果,手機上沒測試不清楚苍苞。

5~區(qū)域的選擇mode='region'

image.png
<view>地址選擇固翰,結(jié)果:{{region[0]}},{{region[1]}}羹呵,{{region[2]}}</view>
<picker mode='region' value="{{region}}" custom-item="{{customItem}}" bindchange="bindRegionChange">click </picker>

value 就是一個數(shù)組 比如骂际,["海南省", "海口市", "秀英區(qū)"]
這個好像微信默認自帶的冈欢,不能設(shè)置數(shù)據(jù)的歉铝,只能設(shè)置默認的選中,
custom-item 就是個string凑耻,可為每一列的頂部添加一個自定義的項太示,比如這個列子就是都加了個 “全部”。
bindchange 事件的結(jié)果 ==value 改變時觸發(fā) change 事件香浩,event.detail = {value: value, code: code, postcode: postcode}类缤,其中字段code是統(tǒng)計用區(qū)劃代碼,postcode是郵政編碼
看下返回的結(jié)果

  bindRegionChange: function (e) {
    console.log('picker發(fā)送選擇改變邻吭,攜帶值為', e.detail.value+"===="+e.detail.code+"==="+e.detail.postcode)
    this.setData({
      region: e.detail.value
    })
  },

log如下
廣西壯族自治區(qū),柳州市,城中區(qū)====450000,450200,450202===545001

picker-view

image.png

picker是個彈框餐弱,而這個是嵌入頁面的,也就是說是直接顯示在頁面的控件
用法囱晴,picker-view就是個容器膏蚓,里邊每一個picker-view-column就是一列,有幾列就弄幾個picker-view-column

<view>
picker-view 學(xué)習(xí)
<view>{{year}}年{{month}}月{{day}}日</view>
<picker-view indicator-style='height: 52px;' style="width: 100%; height: 300px;" value="{{value}}" bindchange="bindChange">
<picker-view-column> 
  <view wx:for="{{years}}" style='line-height:52px;padding-left:15px;'>{{item}}年</view>
</picker-view-column>
<picker-view-column> 
  <view wx:for="{{months}}" style='line-height:52px;'>{{item}}月</view>
</picker-view-column>
<picker-view-column> 
  <view wx:for="{{days}}" style='line-height:52px;'>{{item}}日</view>
</picker-view-column>
</picker-view>
</view>

value :數(shù)組畸写,就是默認選中哪個驮瞧,存儲的是每列的索引,從0開始枯芬,比如上邊有3個剧董,【0,0,0】就是默認選中第一個都
indicator-style :設(shè)置選擇器中間選中框的樣式
indicator-class:設(shè)置選擇器中間選中框的類名幢尚,和上邊一樣,這個指向一個class樣式翅楼,上邊是直接寫而已
mask-style :設(shè)置蒙層的樣式
mask-class : 設(shè)置蒙層的類名
上邊幾個需要進一步學(xué)習(xí)尉剩,得研究下style都能設(shè)置啥。
js code

const years = []

const months = []

const days = []

const date = new Date()

for (let i = 1990; i <= date.getFullYear(); i++) {
  years.push(i)
}

for (let i = 1; i <= 12; i++) {
  months.push(i)
}

for (let i = 1; i <= 31; i++) {
  days.push(i)
}

Page({

  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {
    year:0,
    month:0,
    day:0,
    value:[5,5,5],
    years:years,
    months:months,
    days:days,

  },
  bindChange:function(res){
    var arr=res.detail.value
    this.setData({
      year:years[arr[0]],
      month:months[arr[1]],
      day:days[arr[2]]
    })

  },

slider學(xué)習(xí) 就是android的seekbar

image.png
<view>slider學(xué)習(xí)</view>
默認的啥也不寫的
<slider></slider>
step改為2毅臊,默認值為20理茎,修改背景,選中顏色管嬉,修改滑塊顏色皂林,顯示進度
<slider min='0' max='100' step='2' value='20' backgroundColor='#888888' activeColor='#0000ff' block-size='12' block-color='#00ffff' show-value></slider>

step改為2,默認值為20蚯撩,最小100础倍,最大200,顯示進度
<slider min='100' max='200' step='2' value='20'   show-value bindchange='sliderchange'></slider>
</view>

blocksize 12到28胎挎,默認是28的沟启,看起來好大。
activeColor Color #1aad19 已選擇的顏色
backgroundColor Color #e9e9e9 背景條的顏色
show-value Boolean false 是否顯示當前 value
其他屬性看名字就知道了犹菇,不做介紹了德迹。

switch 切換按鈕學(xué)習(xí)

image.png
<switch>開關(guān)</switch>
<switch checked type='checkbox' color="#0000ff" bindchange='switchchange'>...</switch>

比較簡單的,默認的也就能改下顏色揭芍,type默認就是switch胳搞,如果改成checkbox,那就真成checbox了称杨。

video

https://developers.weixin.qq.com/miniprogram/dev/component/video.html

image.png

如果只是簡單地播放肌毅,不過多操作,給個src 就行姑原,本地地址芽腾,網(wǎng)絡(luò)地址都可以,

本地地址页衙,wx有提供選擇視頻的方法摊滔,

<view class="section tc">
  <video src="{{src}}"   ></video>
  <view class="btn-area">
    <button bindtap="bindButtonTap">獲取視頻</button>
  </view>
</view>

選擇視頻,api以后再仔細看

  bindButtonTap: function () {
    var that = this
    wx.chooseVideo({
      sourceType: ['album', 'camera'],
      maxDuration: 60,
      camera: ['front', 'back'],
      success: function (res) {
        that.setData({
          src: res.tempFilePath
        })
      }
    })
  },

網(wǎng)絡(luò)地址

<video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400" danmu-list="{{danmuList}}" enable-danmu danmu-btn controls></video>
  <view class="btn-area">
    <input bindblur="bindInputBlur"/>
    <button bindtap="bindSendDanmu">發(fā)送彈幕</button>
  </view>

看下彈幕

danmuList: [
      {
        text: '第 1s 出現(xiàn)的彈幕',
        color: '#ff0000',
        time: 1
      },
      {
        text: '第 3s 出現(xiàn)的彈幕',
        color: '#ff00ff',
        time: 3
      }]

  onReady: function () {
    this.videoContext = wx.createVideoContext('myVideo')
  },
//發(fā)送彈幕
  bindSendDanmu: function () {
    this.videoContext.sendDanmu({
      text: this.inputValue,//這個就是個input的值店乐,這里不考慮了
      color: getRandomColor()
    })
  },

測試了一下艰躺,彈幕的time應(yīng)該是秒,表示第幾秒出現(xiàn)眨八。
在sendDanmu方法里腺兴,添加了time貌似沒效果,都是立馬就出現(xiàn)了廉侧。重播的時候彈幕也是在相應(yīng)的時間出現(xiàn)的页响,看來內(nèi)部會自動添加時間的篓足。

map

https://developers.weixin.qq.com/miniprogram/dev/component/map.html#map
屬性太多,用的時候再仔細看吧闰蚕,先放過栈拖。

wx提供的基本組件算是大概看完了,下邊學(xué)習(xí)別的

自定義組件

看了一下没陡,暈乎乎的涩哟。改天再找找有沒有別人寫的,看官方的估計夠嗆盼玄。

之后再研究下api贴彼,瞅了下不少了,一個個試下效果埃儿。今天就先這樣拉器仗。

-------------------------------------20180813----------------

過完周末,今天來測試下童番,弄個水平的滾動條

代碼如下精钮,結(jié)果了,上邊那個顯示的是垂直方向的妓盲,見了鬼了,
兩個的區(qū)別就是上邊的用的for循環(huán)來弄的,其他style都一樣的专普,可下邊的是正常的悯衬,水平方向滾動的,上邊那個死活都是垂直的

<view>
<scroll-view scroll-x style="width: 100%;white-space: nowrap;" wx:for="{{array}}"  wx:key='text'>
<button class='btn_width'>{{item.text}}</button>
</scroll-view>

  <scroll-view scroll-x style="width: 100%;white-space: nowrap;"> 
    <button bindtap='gotext1' class="btn_width" >go text1</button>
  <button bindtap='gobottom' class="btn_width">go bottom</button>
  <button bindtap='gotop' class="btn_width">go top</button>
  <button bindtap='scroll20' class="btn_width">scrollTop 10</button>
  </scroll-view>
</view>

為啥for循環(huán)構(gòu)建的就不行了檀夹,我把for刪了筋粗,然后button復(fù)制了幾個,它是可以的炸渡,那現(xiàn)在問題就是出現(xiàn)在for循環(huán)上了娜亿?
突發(fā)靈感,想著外邊套個block蚌堵,沒想到真的可以

<scroll-view scroll-x style="width: 100%;white-space: nowrap;" >
<block wx:for="{{array}}"  wx:key='text'>
<view style="display:inline-block;width:100px;height:150px;margin-left:10px;background:#888">{{item.text}}</view>
</block>
</scroll-view>

學(xué)這玩意感覺還得懂style买决,style不熟,寫起來真費勁吼畏,想水平他就死活是垂直的督赤。

剛測試碰到的問題

也沒看到文檔說movable-area一個頁面只能有一個,我弄了2個泻蚊,結(jié)果第二個蓋到第一個上邊去了骚亿。
如下代碼,首先movable-view的寬度需要根據(jù)子view的個數(shù)來算出來膊夹。
下邊兩種選一種,兩個都寫上去就發(fā)現(xiàn)后邊那個蓋在前邊那個上邊了N锱纭!然后我繼續(xù)寫才發(fā)現(xiàn)骑脱,不是2個movable-view的問題,是movable-view后邊跟啥view都蓋在它上邊。
開始我還以為只能靠margin來解決了诀拭,后來來靈感了,我把;height:220rpx加上病蛉,發(fā)現(xiàn)沒問題炫加,不會蓋住了
正確的代碼是這樣的<movable-area style="width:auto;height:220rpx">,需要把高度寫上的铺然。而且這個寬度必須是auto的俗孝,你如果寫的固定的,那怕寫個10000px魄健,那么內(nèi)容也滾不出屏幕的赋铝。

  <movable-area style="width:auto">
    <movable-view style='height:220rpx;width:1120rpx' direction="horizontal" inertia out-of-bounds>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#000;float:left'></view>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#111;float:left'></view>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#222;float:left'></view>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#333;float:left'></view>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#444;float:left'></view>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#555;float:left'></view>
      <view style='width:160rpx;height:220rpx;display:inline-block;background-color:#666;float:left'></view>
    </movable-view>
  </movable-area>

  <movable-area style="width:auto;">
    <movable-view style='height:220rpx;width:1280rpx;' direction="horizontal" inertia out-of-bounds>
    <block  wx:for="{{array}}" wx:key='text'>
     <button style='width:160rpx;height:220rpx;display:inline-block;background-color:#888;float:left'>{{item.text}}</button>
    </block>
    </movable-view>
  </movable-area>
image.png

問題

今天看到別人獲取點擊事件的參數(shù)的時候是這樣寫的
event.target.dataset.id
我只知道有下邊這種
event.currentTarget.dataset.id
我打印了下2個結(jié)果是一樣的,誰知道這兩個有啥區(qū)別沽瘦?

style 和class同時存在革骨,哪個生效?

測試了一下析恋,如果兩者里邊的屬性不一樣的話良哲,好像都生效了,如果有一樣的屬性的話助隧,那么style的級別高點筑凫。

hover-class

不知道這東西干啥的,今天搜了下并村,說是設(shè)置點擊效果的巍实,貌似還只支持view,button哩牍,navigator.
感覺就是根據(jù)觸摸來動態(tài)修改背景顏色的棚潦。 如果你class或者style里也設(shè)置了background,那么這玩意就無效了膝昆。

<view hover-class='green'>測試hover class</view>

.green{
  background: green
}

先學(xué)點樣式

不學(xué)樣式感覺展示點東西都費勁丸边,都只能默認的從上到下。
https://www.cnblogs.com/liujun1128/p/7767123.html
copy點代碼
微信小程序的布局css樣式
width: fit-content;
font-size:20px; /設(shè)置文字字號/
color:red; /設(shè)置文字顏色/
font-weight:bold; /設(shè)置字體加粗/
border:1px solid red;/添加邊框樣式(粗細為1px荚孵, 顏色為紅色的實線)/
font-family:"宋體"; /設(shè)置字體為宋體/

font-style:italic; /文字排版--斜體/
text-decoration:underline; /文字排版--下劃線/
text-decoration:line-through;/文字排版--刪除線/
text-indent:2em; /段落排版--縮進/
line-height:1.5em; /段落排版--行間距(行高)/
letter-spacing:50px; /段落排版--中文字間距/
word-spacing:50px; /字母間距/
text-align:center; right ; left ; /段落排版--對齊/

display:inline-flex; /將對象作為內(nèi)聯(lián)塊級彈性伸縮盒顯示/
display:block; /設(shè)置為塊狀元素/
display:inline; /設(shè)置為內(nèi)聯(lián)元素/
display:inline-block; /設(shè)置為內(nèi)聯(lián)塊狀元素/

word-break:keep-all; /* 不換行 /
white-space:nowrap; /
不換行 /
vertical-align:middle; /
把此元素放置在父元素的中部原环。*/

border-style(邊框樣式)常見樣式有: (border-color,border-width) 邊框相關(guān)設(shè)置
dashed(虛線)| dotted(點線)| solid(實線)。
border-bottom border-top border-right border-left 上下左右線單獨設(shè)置

box-sizing: border-box; //當使用padding的時候不影響大小
padding-top padding-right padding-bottom padding-left
margin-top margin-right margin-bottom margin-left (margin:10px 10px 10px 10px; top处窥、right嘱吗、bottom、left)

下邊是代碼,看下效果

<view hover-class='green' class='text-test'>測試hover class 順道測試點樣式之類的</view>


.text-test{
width: fit-content;
font-size:20px;      /*設(shè)置文字字號*/
color:red;           /*設(shè)置文字顏色*/
font-weight:bold;    /*設(shè)置字體加粗*/
border:1px dashed red;/*添加邊框樣式(粗細為1px谒麦, 顏色為紅色的實線)*/
font-family:"宋體";   /*設(shè)置字體為宋體*/

font-style:italic;    /*文字排版--斜體*/
text-decoration:underline;   /*文字排版--下劃線*/
text-indent:2em;             /*段落排版--縮進*/
line-height:1.5em;           /*段落排版--行間距(行高)*/
letter-spacing:1px;         /*段落排版--中文字間距*/
word-spacing:30px;           /*字母間距*/
text-align:right;   /*段落排版--對齊 center right ; left ;*/
}

text-align:center;的作用俄讹,一個left,一個center 效果


image.png

image.png

border:1px dashed red;/添加邊框樣式(粗細為1px绕德, 顏色為紅色的實線)/
中間的dashed 可以修改dashed(虛線)| dotted(點線)| solid(實線)
也可以單獨的設(shè)置,級別比border高患膛,會覆蓋上邊border的設(shè)置

border-color: #0000ff;
border-width: 3px;
border-radius: 10px;

border-radius: 50%; 試了一下,貌似取的是寬高的50%耻蛇,直接成了橢圓了
border-style:這個是邊框的樣式踪蹬,上邊的虛線,實線臣咖,點線都算跃捣。

border

搜了下樣式,效果是這樣的

p.dotted {border-style: dotted}
p.dashed {border-style: dashed}
p.solid {border-style: solid}
p.double {border-style: double}
p.groove {border-style: groove} //凹槽夺蛇,壓線
p.ridge {border-style: ridge}//脊線
p.inset {border-style: inset}
p.outset {border-style: outset}

效果圖


image.png

letter-spacing:1px; 這個是文字之間的距離疚漆,比如‘測試’這兩個字的之間的間隔
word-spacing:30px; 單詞之間的距離了吧,單詞和單詞之間刁赦,單詞和漢字之間的距離娶聘。

display:inline-flex

  <view wx:for="{{array}}" wx:key="text" class='row_show'>
    <text  style="width:200rpx" class="tab-text-margin {{tabIndex==index?'tab-text-selected':''}}" catchtap='tapClick' data-id="{{index}}">{{item.text}}</text>
  </view>
image.png

display:inline

發(fā)現(xiàn)最后一個777不見了


image.png

display:inline-block

777出來了


image.png

display:block

感覺這個就是默認的效果,也就是一行顯示一個


image.png

----------------------------20180814-----------------------

單位rem

看別人代碼甚脉,發(fā)現(xiàn)用的這個單位丸升,不知道啥玩意,查一下
https://www.cnblogs.com/wxcbg/p/5908967.html
rem(font size of the root element)是指相對于根元素的字體大小的單位牺氨。簡單的說它就是一個相對單位狡耻。看到rem大家一定會想起em單位波闹,em(font size of the element)是指相對于父元素的字體大小的單位酝豪。它們之間其實很相似涛碑,只不過一個計算的規(guī)則是依賴根元素一個是依賴父元素計算精堕。

突然發(fā)現(xiàn)不會樣式,想弄一個布局出來都不會蒲障,比如android里的相對布局歹篓,幀布局,小程序咋實現(xiàn)的啊揉阎,我想讓一個view在另一個view的下邊庄撮,不會。
先不學(xué)這個了毙籽。先把api簡單看一遍洞斯,然后找個demo去研究,之后再仔細學(xué)樣式吧

頁面數(shù)據(jù)傳遞

傳遞數(shù)據(jù)都是弄成基本類型,完事傳過去
比如下邊的ci是個字符串烙如,或者數(shù)字等么抗,可以直接寫。
如果是個對象亚铁,或者數(shù)組蝇刀,那么里用JSON.stringify轉(zhuǎn)化為字符串。
就和網(wǎng)絡(luò)請求傳參數(shù)一樣徘溢?key=value&key2=value2

wx.navigateTo({
      url: '../day09-2/day09-2?index=' + ci + '&trees=' + JSON.stringify(對象或者數(shù)組都行),
    })

接收的頁面在onLoad里就能拿到

 onLoad: function (options) {
    that=this;
    var trees=JSON.parse(options.trees)
    var index=options.index
}

使用的時候發(fā)現(xiàn)坑啦吞琐。傳數(shù)據(jù)的時候有時候就出問題了。齊了怪了然爆,后來把數(shù)據(jù)打印了一下站粟,才發(fā)現(xiàn)
如下圖,我傳了一個對象過去施蜜,而這個對象字符串里是有 & 這個字符的卒蘸,結(jié)果被小程序從這里分開了,后邊的數(shù)據(jù)當成另外的key value了翻默,所以到下個頁面解析就掛了缸沃。


image.png

這種轉(zhuǎn)換字符串的方法不行,那咋辦了修械?

1~ 弄個全局變量趾牧,在app的globalData里添加一個字段,把數(shù)據(jù)傳進去肯污,下個頁面再取
2~ 使用緩存

https://developers.weixin.qq.com/miniprogram/dev/api/data.html#wxremovestoragesynckey

image.png

比如跳轉(zhuǎn)前把數(shù)據(jù)存起來

wx.setStorageSync("tree", 對象或者數(shù)組都行)

跳轉(zhuǎn)后的頁面這樣取

var trees=wx.getStorageSync("tree")

刪除數(shù)據(jù)

  wx.removeStorage({
    key: 'tree',
    success: function(res) {},
  })

3~從頁面a跳轉(zhuǎn)到頁面b翘单,那么頁面b咋獲取或者修改頁面a的數(shù)據(jù)?

頁面a有如下數(shù)據(jù)

  data: {
    colors:[
      "#4DCCF6", "#FF9999", "#999933", "#009999", "#FF9900", "#009999"
    ],
  }

下邊是頁面b的代碼

var pages=getCurrentPages()
    var prePage=pages[pages.length-2]
    var colors=prePage.data.colors //獲取
    console.log("test============"+JSON.stringify(colors))
    prePage.setData({
      //修改
    })

可以看到蹦渣,通過getCurrentPages()可以獲取到當前所有的頁面哄芜,根據(jù)索引可以獲取到上個頁面,拿到page以后柬唯,想干啥都行啦认臊。

使用cookie登陸

小程序咋用cookie,百度了好多帖子锄奢,都在講一些沒用的失晴,看完了,都不知道咋下手拘央,還好找到下邊這帖子涂屁,簡單粗暴,獲取cookie灰伟,使用cookie拆又,完事。
https://blog.csdn.net/DylanCat/article/details/78186427

情況說明

我們這的測試接口,cookie是在登陸返回的
我們知道wx.request的success方法的參數(shù)是有3個
data >>>>Object/String/ArrayBuffer>>>> 開發(fā)者服務(wù)器返回的數(shù)據(jù)
statusCode>>>>Number >>>>開發(fā)者服務(wù)器返回的 HTTP 狀態(tài)碼
header>>我們的cookie就在header里帖族,如下所示,就是header的內(nèi)容

{
    "Server":"Apache-Coyote/1.1",
    "Set-Cookie":"JSESSIONID=E765E28A5187699FCC2ABB363A53FDA5; Path=/; HttpOnly,loginUserName=111111111111; Expires=Sat, 15-Sep-2018 08:38:24 GMT; Path=/,loginUserPassword=xxxxx; Expires=Sat, 15-Sep-2018 08:38:24 GMT; Path=/,token_pass=4d140275ca869afde23c48d577d47065; Expires=Sat, 15-Sep-2018 08:38:24 GMT; Path=/",
    "Content-Type":"application/json;charset=UTF-8",
    "Date":"Thu, 16 Aug 2018 08:38:24 GMT",
    "X-Cache":"MISS from SD-Endian5.magellangps.com",
    "X-Cache-Lookup":"MISS from SD-Endian5.magellangps.com:8080",
    "Transfer-Encoding":"chunked",
    "Via":"1.1 SD-Endian5.magellangps.com (squid/3.4.14)",
    "Connection":"keep-alive"
}

請求成功以后把cookie保存 "cookieKey" 保存的key义矛,名字自己起。

    wx.request({
      url:'https://.............',
      method:'POST',
      success: function (res) {
        wx.setStorageSync("cookieKey", res.header["Set-Cookie"])
      }
    })

然后在需要cookie的接口上使用

 var  header = {
      'content-type': 'application/x-www-form-urlencoded',
     'cookie': wx.getStorageSync("cookieKey")//讀取cookie
    };
wx.request({
  url: 'test.php', //僅為示例盟萨,并非真實的接口地址
  header:header ,
  success: function(res) {
    console.log(res.data)
  }
})

字符串的一些操作

上邊的cookie要拿到里邊的過期時間凉翻,不知道咋弄,只好按照java的代碼來操作
發(fā)現(xiàn)split方法可用捻激,trim方法可用制轰,
另外搜了下,這里還有別的用法可以看看
https://blog.csdn.net/qq_23833037/article/details/79294190

    if(header!=null){
        var arr=header.split(';')
        for(var i=0;i<arr.length;i++){
            var kv=arr[i].trim()
            console.log("kv=========="+kv)
          if (kv.startsWith("Expires")){
              var value=kv.substring(8)
            console.log("value==========" + value)
           if(Date.now()<Date.parse(value)){
              return
            }
          }
        }
     
    }

時間的操作

Date.now() 返回當前時間 ms 13位
Date.parse("Sat, 15-Sep-2018 08:38:24 GMT") 解析后返回的也是13位的ms
另外我們utils下默認有個時間格式化的胞谭,可以參考

  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')

上邊return的東西簡單說下垃杖,[year, month, day] 造了個數(shù)組,沒啥說的丈屹,后邊跟個map方法调俘,這學(xué)過rx或者kotlin的應(yīng)該知道吧,這就是對原始數(shù)據(jù)的一個轉(zhuǎn)換旺垒,轉(zhuǎn)換完還是個數(shù)組彩库,不過成了字符串數(shù)組了。

然后 數(shù)組.join 方法先蒋,上邊字符串操作的那個外部文章有講到 骇钦,就是把數(shù)組里的東西用join后邊的字符連接起來
,比如【a,b,c】.join('/') 結(jié)果就是 a/b/c

new Date().toLocaleTimeString()
new Date().toLocaleDateString()
new Date().toLocaleString())
上邊3個方法返回的結(jié)果如下:
下午5:35:22=======2018/8/16========2018/8/16 下午5:35:22

flex 繼續(xù)研究

http://www.reibang.com/p/2212146c0f57
http://www.runoob.com/w3cnote/flex-grammar.html

研究下justify-content

space-between
.item-rect{
  width: 100rpx;
  height: 100rpx;
  color: #00f;
  background: #888;

}

.layout{
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  flex-flow: row wrap;
  justify-content: space-between;
  height: 400rpx;
  border: 1px solid red;
  
}

看效果圖竞漾,首先左右兩邊一邊一個眯搭,完事剩下的平分多余的空間


image.png
space-around

  justify-content: space-around;

看效果圖,就是大家平分所有的多余空間业岁,換句話說鳞仙,大家左右兩邊的margin是一樣的。


image.png

flex-start flex-end center

這個3個笔时,左邊棍好,右邊,中間就沒啥說的了


image.png

image.png

垂直方向align-items: flex-start;

效果就是上圖

垂直方向align-items: flex-end;

.item-rect{
  width: 100rpx;
  height: 100rpx;
  color: #00f;
  background: #888;

}

.layout{
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  flex-flow: row wrap;
  justify-content: space-around;
  height: 400rpx;
  border: 1px solid red;
  align-items: flex-end;
}
image.png

align-items: center;

image.png

我們上邊這些圖糊闽,都是2行梳玫,也就是有2個主軸線的爹梁,這個時候align-content才起作用

align-content: center;
.item-rect{
  width: 100rpx;
  height: 100rpx;
  color: #00f;
  background: #888;

}

.layout{
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  flex-flow: row wrap;
  justify-content: space-around;
  height: 400rpx;
  border: 1px solid red;
  align-items: center;
  align-content: center;
}
image.png

多行的時候align-content生效

單行的話align-items生效
如下,看圖右犹,flex-start生效中

.layout{
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  flex-flow: row wrap;
  justify-content: center;
  height: 400rpx;
  border: 1px solid red;
  align-items: flex-end;
  align-content: flex-start;
}
image.png

上邊都是容器的介紹,下邊介紹項目的屬相

測試了下咋都沒效果姚垃。念链。再說
https://www.w3cschool.cn/weixinapp/route.html

使用flex布局的容器,子元素的float、clear和vertical-align屬性將不起作用掂墓。

display屬性

http://www.w3school.com.cn/cssref/pr_class_display.asp

數(shù)組添加數(shù)據(jù)
lists.concat(lists)

居左居右顯示

要實現(xiàn)下圖的效果谦纱,取消收藏的文字在右邊居中,其他部分在左邊


image.png

樣式只會簡單的flex君编,也沒有android的相對布局跨嘉,幀布局,約束布局等吃嘿,弄個稍微復(fù)雜點的布局還挺費勁
我的思路祠乃,左邊為一部分,右邊為一部分兑燥,完事外層容器flex-direction=row 默認的水平顯示
justify-contents=space-between 剛好左右一邊一個亮瓷,垂直方向就是align-items=center
完整的如下2個

.item-style{
  border-width: 1px;
  border-color: rgb(226, 219, 219);
  border-style: solid;
  margin-top: 20rpx;
  margin-left: 1rpx;
  margin-right: 2rpx;
  font-size: 13px;
  padding: 10rpx;
}
.item-h{
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-content: center;
  align-items: center;
}

不過弄完會發(fā)現(xiàn)右邊的文字有時候會換行,所以設(shè)置了下邊屬性,nowrap禁止換行

.cancelLove{
  display: block;
  color: rgb(216, 191, 191);
  white-space: nowrap;
  padding: 10rpx;
}

節(jié)點信息獲取

要寫個懸浮條降瞳,需要知道頂部控件的高度嘱支。所以來研究下如何獲取控件的信息
https://developers.weixin.qq.com/miniprogram/dev/api/wxml-nodes-info.html#wxcreateselectorquery

wx.createSelectorQuery().select('#topview').boundingClientRect(function (res){
        console.log("width/height==="+res.width+"="+res.height+"==="+res.bottom+"=="+res.top)
        that.setData({
          top:res.height
        })
    }).exec();

  onPageScroll:function(event){
    var top = event.scrollTop//監(jiān)聽滾動的距離
    // console.log("scroll=================="+top)
    var fix=top>this.data.top
    if(fix!=this.data.fiexed){
      this.setData({
        fiexed:fix
      })
    }
  },

wx.createSelectorQuery()

返回一個SelectorQuery對象實例≌跫ⅲ可以在這個實例上使用select等方法選擇節(jié)點除师,并使用boundingClientRect等方法選擇需要查詢的信息。

示例代碼:

Page({
  queryMultipleNodes: function(){
    var query = wx.createSelectorQuery()
    query.select('#the-id').boundingClientRect()
    query.selectViewport().scrollOffset()
    query.exec(function(res){
      res[0].top       // #the-id節(jié)點的上邊界坐標
      res[1].scrollTop // 顯示區(qū)域的豎直滾動位置
    })
  }
})

selectorQuery.select(selector)
在當前頁面下選擇第一個匹配選擇器selector的節(jié)點扔枫,返回一個NodesRef對象實例馍盟,可以用于獲取節(jié)點信息。
selector類似于CSS的選擇器茧吊,但僅支持下列語法贞岭。

ID選擇器:#the-id
class選擇器(可以連續(xù)指定多個):.a-class.another-class
子元素選擇器:.the-parent > .the-child
后代選擇器:.the-ancestor .the-descendant
跨自定義組件的后代選擇器:.the-ancestor >>> .the-descendant
多選擇器的并集:#a-node, .some-other-nodes

selectorQuery.selectViewport()
選擇顯示區(qū)域,可用于獲取顯示區(qū)域的尺寸搓侄、滾動位置等信息瞄桨,返回一個NodesRef對象實例。

要讓一個節(jié)點懸浮在頂部的方法如下圖
position: fixed; 可以懸浮讶踪,可懸浮的時候位置是距離頂部有 一定距離的芯侥,所以需要top=0來處理,還得加上z-order的屬性乳讥,不能在一個層級上了柱查,層級得高點,弄個比1大的就行云石,這樣能保證滾動的時候其他view在它的下邊唉工。


image.png

----------------這幾天有事,都沒學(xué)小程序了汹忠,今天抽空繼續(xù)學(xué)一點----------

今天學(xué)習(xí)下position淋硝,主要是前幾天雹熬,也就是上邊學(xué)的懸浮,看到有position=fixed谣膳,想了解下所有的position

position

http://www.w3school.com.cn/cssref/pr_class_position.asp
看完終于知道咋寫android里的相對布局或者幀布局之類的竿报,就是想要一個控件在另一個控件的上邊,如下這種banner继谚,圖片上邊有文字

image.png

  <swiper indicator-dots indicator-active-color='#0000ff' autoplay>
    <block wx:for="{{banners}}" wx:key='id'>
      <swiper-item>
        <view>
          <image class='banner-image' mode='widthFix' src="{{item.imagePath}}"></image>
          <text class='banner-text'>{{item.title}}11</text>
        </view>
      </swiper-item>
    </block>
  </swiper>

以前不會寫烈菌,就寫了個banner-image的樣式【文字不顯示,不知道跑哪去了】花履,今天把banner-text的加上僧界,終于可以顯示文字拉~~~~~~~~

z-index

圖層的順序,默認都是0臭挽,也就是同一級別的捂襟,現(xiàn)在text的改為1,自然就跑到圖片上邊去了欢峰,或者你把image的改成-1葬荷,也可以。

position:abusolute 在父元素內(nèi)部

絕對布局纽帖,感覺就是android里的相對布局宠漩,完事通過left,rigth,top,bottom來確定位置。
這個left,top 需要2個來確定位置懊直,也就是4個頂點扒吁,你寫一個好像沒效果。
如果view的高度沒有設(shè)置室囊,而你top=0雕崩,bottom=0.那么view會拉伸的和父元素一樣高。
比如你top=0融撞,bottom=0盼铁,而view自身高度設(shè)置了,那么bottom是無效的尝偎,優(yōu)先top饶火。

.banner-image{
  width: 100%;
}
.banner-text{
  width: 100%;
  position: absolute;
  bottom: 0px;
  left: 0px;
  z-index: 1;
  background: #444400;
  color: #fff;
  font-size: 13px;
}

abusolute還有個額外的屬性clip,后邊跟一個rect (top, right, bottom, left) 裁剪區(qū)域,這個區(qū)域里的東西是可見的,裁剪區(qū)域rect的值致扯,是對view本身的左上頂點開始算的肤寝。看下效果圖就知道了

.test{
  position: absolute;
  top: 40px;
  background: #00ff00;
  width: 100px;
  height: 40px;
  clip: rect(0px,50px,40px,0px)
}
image.png
position:relative 相對自己原本位置的

css里的相對位置抖僵,和android是不太一樣的鲤看,這個玩意好像是相對自己原本的位置來說的。


image.png

原本就是默認的顯示在左側(cè)的裆针,現(xiàn)在往右邊移動了50px;
left 正的刨摩,往右邊移動,負的世吨,往左邊移動澡刹。相對于view原本左邊的位置
right,正的耘婚,往左邊移動罢浇,負的,往右邊移動沐祷,相對于view原本右邊的位置

.test{
  position: relative;
  left: 50px;
  background: #00ff00;
  width: 100px;
}

弄了個圖嚷闭,黑框就是view原本的位置,然后中間4個箭頭方向的用正的赖临,往外4個箭頭方向的就是負的胞锰。


image.png
position:fixed 相對應(yīng)該說是整個頁面的吧

同樣通過 "left", "top", "right" 以及 "bottom" 來對位置進行處理,可以顯示在上邊兢榨,下邊嗅榕,左邊,右邊吵聪。

position:sticky

粘性定位凌那,該定位基于用戶滾動的位置。
它的行為就像 position:relative; 而當頁面滾動超出目標區(qū)域時吟逝,它的表現(xiàn)就像 position:fixed;帽蝶,它會固定在目標位置。
注意: Internet Explorer, Edge 15 及更早 IE 版本不支持 sticky 定位块攒。 Safari 需要使用 -webkit- prefix (查看以下實例)励稳。
效果圖


image.png
image.png

測試代碼如下,需要注意,需要設(shè)置left囱井,top之類的屬性麦锯,因為相當于fixed的時候你得確定它到底該顯示在屏幕的哪個邊上。
剛測試了下琅绅,繼續(xù)網(wǎng)上滾扶欣,還能時不時的看到這個view蹦出來,不知道z-index是不是出問題拉千扶。

.test{
  position: sticky;
  left: 0px;
  top: 0px;

  background: #00ff00;
  width: 100px;
  height: 80px;
}

如何居中顯示料祠?

https://blog.csdn.net/hs12341234/article/details/47148653

下邊的是居右,垂直方向居中澎羞。

.love-style{
   width: 20px;
  height: 20px;
  position: absolute;
  right: 10px;
  bottom: 0px;
  top: 0px;
  margin: auto;
}

居中涌穆,需要注意margin:auto是必須的,要不無效額匣椰。如果左右也要居中,那把left:0加上即可枫攀。


image.png

第二種寫法,只演示上下垂直,左右一個道理
top:50%,使得元素的top在父容器的中心株茶,完事通過transform来涨,移動-50%,往上移動,這樣元素中心就在父容器中心拉启盛。

.love-style{
   width: 20px;
  height: 20px;
  right: 10px;
  position: absolute;
  bottom: 10px;
  top: 50%;
  transform: translate(0,-50%); 
/* transform: translateY(-50%); 這樣寫也可以*/
}

第三種蹦掐,和上邊差不多,不過把transform改成
margin-top: -10px; 即可僵闯,也是相當于往上移動了自身的一半

日常問題

<view>
  <view class='root' wx:for="{{dirs}}" wx:key="dir" bindtap="navigation" data-dir="{{item.dir}}">
    <button>{{item.dir}}</button>
  </view>
  <text class=' line_after'>juest test.......1</text>
  <text class='line_bottom'>juest test.......2</text>
</view>

如上wxml文件卧抗,跟view啥也沒樣式也沒有,完事root樣式里設(shè)置了display,結(jié)果發(fā)現(xiàn)后邊2 個text的效果跟隨了root的設(shè)置鳖粟。下圖這樣子社裆,不是我們要的效果。


image.png

如果要text換一行向图,不和上邊的button擠在一起浦马,那么就如下代碼里,打開注釋的地方张漂,給text添加一個display即可晶默。


.line_after{
  text-decoration:line-through;
  /* display: flex; */
}
.line_bottom{
  text-decoration: underline;
}
.root{
  display: inline-flex;
  flex-wrap: wrap;
  flex-direction: row;
  padding: 5px;
}
button{
  margin: 5px;
}

垂直方向有2個scroll-view

scroll-view垂直滾動,必須設(shè)置固定高度航攒。


image.png
<scroll-view class="left-view" scroll-y scroll-with-animation scroll-into-view="{{current}}" style="height:{{vheight}}px;">

使用style="height:{{vheight}}px;" 磺陡,然后在代碼里獲取屏幕的可用高度,代碼需要注意加上px漠畜,要不沒效果

    wx.getSystemInfo({
      success: function(res) {
        that.setData({
          vheight: res.windowHeight,
        })
        console.log("=========="+res.screenHeight+"=="+res.statusBarHeight+"=="+res.windowHeight)
      },
    })

具體看這里
https://developers.weixin.qq.com/miniprogram/dev/api/systeminfo.html#wxgetsysteminfoobject

參數(shù) 說明 最低版本
brand 手機品牌 1.5.0
model 手機型號
pixelRatio 設(shè)備像素比
screenWidth 屏幕寬度 1.1.0
screenHeight 屏幕高度 1.1.0
windowWidth 可使用窗口寬度
windowHeight 可使用窗口高度
statusBarHeight 狀態(tài)欄的高度 1.9.0
language 微信設(shè)置的語言
version 微信版本號
system 操作系統(tǒng)版本
platform 客戶端平臺
fontSizeSetting 用戶字體大小設(shè)置币他。以“我-設(shè)置-通用-字體大小”中的設(shè)置為準,單位:px 1.5.0
SDKVersion 客戶端基礎(chǔ)庫版本

單位的換算

https://www.cnblogs.com/helena000/p/5989077.html
rpx單位是微信小程序中css的尺寸單位憔狞,rpx可以根據(jù)屏幕寬度進行自適應(yīng)蝴悉。

規(guī)定屏幕寬為750rpx。如在 iPhone6 上瘾敢,屏幕寬度為375px拍冠,共有750個物理像素,則750rpx = 375px = 750物理像素簇抵,1rpx = 0.5px

設(shè)備 rpx換算px (屏幕寬度/750) px換算rpx (750/屏幕寬度)
iPhone5 1rpx = 0.42px    1px = 2.34px
iPhone6 1rpx = 0.5px     1px = 2rpx
iPhone6s 1rpx = 0.552px    1px = 1.81rpx

微信小程序也支持rem尺寸單位庆杜,rem和rpx的換算關(guān)系:rem: 規(guī)定屏幕寬度為20rem;1rem = (750/20)rpx =37.5rpx;
vw碟摆、vh適配
vw和vh是css3中的新單位晃财,是一種視窗單位,在小程序中也同樣適用典蜕。

小程序中断盛,窗口寬度固定為100vw罗洗,將窗口寬度平均分成100份,1份是1vw
小程序中钢猛,窗口高度固定為100vh 伙菜,將窗口高度平均分成100份,1份是1vh

日常問題

view a里包含另外一個view b厢洞,然后給a弄了個border仇让,然后view b的position是abusolute典奉,left=0躺翻,這時候會發(fā)現(xiàn)border左邊的線不見了。卫玖。其實是被view b給蓋住了公你,讓b的left不為0即可

hover-class

指定按下去的樣式類。當 hover-class="none" 時假瞬,沒有點擊態(tài)效果
支持 hover-class 屬性的組件有三個:view陕靠、button、navigator
這個在button的情況下脱茉,很容易是無效的剪芥。
當button的type不是deault ,plain為 true的時候琴许,設(shè)置hover-class是無效的税肪。
今天敲代碼的時候,咋弄都沒有效果榜田,弄的我好迷糊益兄,如下圖圈中的部分,我開始寫的時候單詞是對的箭券,可它沒有那個顏色的提示框净捅,這時候顏色應(yīng)該是不識別的,可也不報錯辩块,我就說咋一直沒效果蛔六。希望不要和我一樣。废亭。


image.png

worker學(xué)習(xí)

這文檔看完古今,實例看完,感覺和沒看差不多滔以。
https://developers.weixin.qq.com/miniprogram/dev/api/createWorker.html
首先app.json里添加workers的支持 "workers":"worker", 指定一個目錄
然后就寫一個worker的js文件
如下test.js ,延遲4秒后告訴ui捉腥,我干完活了。

setTimeout(any=>{
  worker.postMessage({
    msg: '工作結(jié)束',
  })
},4444)

page頁面的代碼
//以我現(xiàn)在測試的結(jié)果你画,感覺wx.createWorker方法運行以后就會立馬執(zhí)行test.js里的代碼了抵碟,我剛開始把這弄到page外邊全局變量的桃漾,test.js也沒有延遲,然后就發(fā)現(xiàn)拟逮,我下邊的onMessage啥也接收不到撬统。
不知道worker創(chuàng)建完,我要給它傳參數(shù)咋傳敦迄?百度沒找到恋追,文檔沒看懂。 demo我試了罚屋,我發(fā)現(xiàn)打印的日志也就和我這里的差不多苦囱,其他也都沒打印。

我現(xiàn)在的理解

我感覺workers的js代碼里只能postMessage,而page里的代碼只能onMessage接收消息脾猛。

    var worker = wx.createWorker('worker/request/test.js')
    console.log("click====="+event.currentTarget.dataset.str)

     worker.onMessage(function (res) {
       console.log("onMessage========",res)
    })

以后弄明白了再來修改這個撕彤。

動畫 wx.createAnimation(OBJECT)

scale_anim:wx.createAnimation({
      duration: 4000,
      timingFunction: '"linear"',
      delay: 0,
      transformOrigin: '"50% 50% 0"',
    })

wxml里設(shè)置動畫事件

<view class='anim_parent'>
<image src='../../res/love_red.png' style='width:100rpx;height:100rpx' animation="{{scale_anim}}"></image>
</view>

.anim_parent{
  padding: 100rpx;
}

js代碼里實現(xiàn)動畫屬性,下邊是一個按鈕的點擊事件

  start_anim:function(){
    var anima = wx.createAnimation({
      duration: 3000,
      timingFunction: 'linear'
    })
    anima.scale(2).step()
    this.setData({
      scale_anim: anima
    })
  },

timingFunction 有效值:

值 說明
linear 動畫從頭到尾的速度是相同的
ease 動畫以低速開始,然后加快猛拴,在結(jié)束前變慢
ease-in 動畫以低速開始
ease-in-out 動畫以低速開始和結(jié)束
ease-out 動畫以低速結(jié)束
step-start 動畫第一幀就跳至結(jié)束狀態(tài)直到結(jié)束
step-end 動畫一直保持開始狀態(tài)羹铅,最后一幀跳到結(jié)束狀態(tài)

通過var animation = wx.createAnimation({})創(chuàng)建完動畫以后,就可以進行各種設(shè)置了愉昆。
平移职员,旋轉(zhuǎn),拉伸跛溉,傾斜焊切。
https://developers.weixin.qq.com/miniprogram/dev/api/api-animation.html#wxcreateanimationobject

組合動畫,按照step分組倒谷,分組后一個一個執(zhí)行的

anima.scale(2).step().rotate(100).step() //這個是先放大蛛蒙,在旋轉(zhuǎn)

anima.scale(2).rotate(100).step()//這個中間step去了,所以大家是一組動畫渤愁,放大和旋轉(zhuǎn)同時進行

好像也沒有android里的動畫結(jié)束后可以復(fù)位的功能牵祟,結(jié)束后啥樣就啥樣了。
比如點擊一個按鈕抖格,圖片從100拉伸為200诺苹,然后再點擊一個按鈕,進行旋轉(zhuǎn)180度雹拄,你會發(fā)現(xiàn)收奔,它一邊旋轉(zhuǎn)一邊縮小。

數(shù)組操作

teachers:['jerry','phantom']
長度 tearchers. length=2

 console.log("=========="+this.data.teachers+"===="+this.data.teachers.join("+")+"===="+this.data.teachers.indexOf('phantom')+"==="+this.data.teachers.push("doph"))
    var change=this.data.teachers.splice(1,2);
   console.log("=======" + change.valueOf() + "===" + this.data.teachers)
    //==========jerry,phantom====jerry+phantom====1===3
    //=======phantom,doph===jerry

indexOf() 返回括號里的內(nèi)容在數(shù)組里的索引
join() :首先數(shù)組默認打印出來的是逗號拼接起來的內(nèi)容滓玖。使用join方法坪哄,就會用括號里的東西替換掉逗號
push:往數(shù)組最后添加內(nèi)容,可以添加多個,返回新的數(shù)組長度
unshift():網(wǎng)數(shù)組開頭添加內(nèi)容翩肌,可以一次添加多個模暗,返回新的數(shù)組長度。
splice :從數(shù)組中取出以起始位置開始的位數(shù)的內(nèi)容念祭,并寫入增添內(nèi)容兑宇,可用來刪除內(nèi)容與替換,看下上邊打印的結(jié)果粱坤,因為我們push了一個“doph”,所以數(shù)組應(yīng)該是長度為3的['jerry','phantom','doph']
splice方法以后隶糕,看下打印的結(jié)果,change是從位置1開始取了2個站玄,那么結(jié)果就是phantom,doph枚驻,同時也看到,原始的數(shù)組只剩下了 一個jerry了蜒什。
splice(start,count,inserts[])第三個參數(shù)其實是個數(shù)組测秸,就是說我們把原始數(shù)組的start開始count個數(shù)的元素拿走疤估,完事在這里添加一些inserts的內(nèi)容灾常,填多少個你隨意,也可以不填铃拇。
比如

var temp = ['jerry', 'phantom', 'doph']
    var replace = temp.splice(1, 2, 'insert')
    console.log("========" + temp + "==========" + replace)

結(jié)果========jerry,insert==========phantom,doph

shift() 拿走數(shù)組的第一個元素钞瀑,返回值就是拿出來的這個元素
pop() 拿走數(shù)組的最后一個元素,返回值就是拿出來的這個元素
splice其實也是刪除數(shù)據(jù)的方法慷荔,比如要刪除 index=10的數(shù)據(jù)雕什,就是 tearchers.splice(10,1)
修改數(shù)據(jù)的話就是用索引了 tearchers[10]='xxx'

concat 數(shù)組合并

2個數(shù)組合并,沒啥說的显晶,前邊的添加后邊的

var temp = ['jerry', 'phantom', 'doph']
    var temp2 = ['jerry2', 'phantom2', 'doph2']
    var change=temp.concat(temp2)

修改數(shù)據(jù)以后贷岸,要使ui生效,需要setData
如果只是單獨的修改了數(shù)組里的某條數(shù)據(jù)磷雇,比如index=1 的 teachers:['jerry','phantom'] phantom改成abc
有兩種寫法

this.setData({
'tearchers[1]':'abc'
})
//或者中間加個變量
this.setData({
var change=tearchers[1]
[change]:'abc'
})

看下圖偿警,還有個slice的方法,和splice差不多唯笙,不過這個slice返回的是刪除的第一個元素


image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螟蒸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崩掘,更是在濱河造成了極大的恐慌七嫌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苞慢,死亡現(xiàn)場離奇詭異诵原,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門绍赛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞋拟,“玉大人,你說我怎么就攤上這事惹资『馗伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵褪测,是天一觀的道長猴誊。 經(jīng)常有香客問我,道長侮措,這世上最難降的妖魔是什么懈叹? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮分扎,結(jié)果婚禮上澄成,老公的妹妹穿的比我還像新娘。我一直安慰自己畏吓,他們只是感情好墨状,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菲饼,像睡著了一般肾砂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宏悦,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天镐确,我揣著相機與錄音,去河邊找鬼饼煞。 笑死源葫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的砖瞧。 我是一名探鬼主播息堂,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芭届!你這毒婦竟也來了储矩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤褂乍,失蹤者是張志新(化名)和其女友劉穎持隧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逃片,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡屡拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年只酥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀狼。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡裂允,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哥艇,到底是詐尸還是另有隱情绝编,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布貌踏,位于F島的核電站十饥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祖乳。R本人自食惡果不足惜逗堵,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眷昆。 院中可真熱鬧蜒秤,春花似錦、人聲如沸亚斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伞访。三九已至掂骏,卻和暖如春轰驳,著一層夾襖步出監(jiān)牢的瞬間厚掷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工级解, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冒黑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓勤哗,卻偏偏與公主長得像抡爹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芒划,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 因新工作主要負責微信小程序這一塊冬竟,最近的重心就移到這一塊,該博客是對微信小程序整體的整理歸納以及標明一些細節(jié)點民逼,初...
    majun00閱讀 7,341評論 0 9
  • 一:理解視圖層 類似于“視圖引擎模板”(jsp,freemaker,velocity,thymeleaf等) 框...
    Reg8888閱讀 1,398評論 1 0
  • 給提問的開發(fā)者的建議:提問之前先查詢 文檔泵殴、通過社區(qū)右上角搜索搜索已經(jīng)存在的問題。 寫一個簡明扼要的標題拼苍,并且...
    極樂叔閱讀 13,428評論 0 3
  • 微思考 在閱讀一本書時笑诅,在偷偷為書中的人物想法暗自叫好之余,記錄下來原來還可以這樣想,原來還可以這樣打造人脈吆你。 在...
    懿拾閱讀 225評論 5 1
  • 腦海里再次閃過這句話弦叶,特別想寫一下,卻不知道如何下手妇多,慢慢地想了一會兒伤哺,還是以此時此刻的感受為開頭吧。 “慢工出巧...
    幸福_娟閱讀 546評論 6 5