• 微信小程序scroll-view(滚动组件)与onPullDownRefresh(下拉刷新)


    一.官方api描述  在滚动 scroll-view 时会阻止页面回弹,所以在 scroll-view 中滚动,是无法触发 onPullDownRefresh

     查阅大量资料以后发现一共有三种方式:

    1.使用view代替scroll-view,从而触发onPullDownRefresh

    2.在scroll-view标签上新建一个隐藏的view标签,使用scroll-view标签中bindscrolltoupper(滚动到顶部/左边,会触发事件)显示view标签,做动画模拟上拉刷新

    3.scroll-view标签下添加一个view标签能与onPullDownRefresh结合使用(我猜用的这种)

    二.方法代码如下:
    wxml:

    <scroll-view scroll-y="true" bindscrolltoupper="upper" bindscrolltolower="lower" scroll-with-animation="true" scroll-into-view="{{scrollTopTX}}" class = "ball" ><!---改 llp----->
    <view class='{{dropDown?"list":""}}' >
    <view style='100%;height:100%' bindtouchmove='{{dropDown?"downTouchmove":""}}'>
      <!-- 每一行 -->
      <view class="row" wx:for="{{allContentList}}" wx:key="key" id="row{{index+1}}">
        <!-- 日期 -->
        <view class="datetime" wx:if="{{item.create_time != ''}}">{{item.times}}</view>
        <!-- 头像与内容文本 -->
        <view class="body" style="flex-flow: {{item.myself == 0 ? 'row' : 'row-reverse'}}">
          <view class="avatar-container">
            <image class="avatar" v:if="" src="{{item.head_img_url}}" />
          </view>
     
          <!-- 画三角箭头 -->
          <view class="triangle" wx:if="{{item.msg_type != 'image'}}" style="{{item.myself == 1 ? 'right: 140rpx; background: #7ECB4B' : 'left: 140rpx;'}}"></view>
          <view class="content" style="{{item.myself == 1 ? 'background: #7ECB4B' : ''}};{{item.msg_type == 'image' ? 'background: none' : ''}}">
            <image class="picture" wx:if="{{item.msg_type == 'image'}}" src="{{item.msg}}" mode="widthFix" bindtap="preview" data-src="{{item.msg}}" />
            <view wx:else="{{item.msg_type == 'text'}}">{{item.msg}}</view>
          </view>
        </view>
      </view>
    </view>
    </view>
    </scroll-view>

    wxss:

    @import "../../modules/chat-input/chat-input.wxss";
    /** 聊天窗口样式
    * 54px为回复框高度,js同
    */
    page{
    height: 100%;
    }
    /*加载*/
    .list {
    overflow:auto;
    margin:auto;
    position:absolute;
    top:0;
    bottom:0;
    left:0;
    right:0;
    }

    /*聊天记录*/
    .ball{
    width : 100%;
    height: 92%;
    margin-bottom: 100rpx;
    white-space:nowrap;
    }
    /*单元行*/
    .row {
    display: flex;
    flex-direction: column;
    margin: 0 30rpx;
    }

    /*日期*/
    .datetime {
      font-size: 10px;
      padding: 10px 0;
      color: #999;
      text-align: center;
    }

    /*主体*/
    .body {
      display: flex;
      flex-direction: row;
      align-items: flex-start;
      justify-content: flex-start;
       100%;
      margin-top: 10px;
    }


    /*头像容器*/
    .body.avatar-container {
       20%;
    }

    /*头像*/
    .body .avatar {
       80rpx;
      height: 80rpx;
    background:#fff;
      border-radius: 50%;
      margin: 0 20rpx;
    }

    /*文本消息*/
    .body .content {
      font-size: 30rpx;
      background: #fff;
      border-radius: 20rpx;
      padding:0 24rpx;
      line-height: 80rpx;
      margin-bottom: 10px;
    }

    /* 三角箭头 */
    .body .triangle {
      background: white;
       20rpx;
      height: 20rpx;
      margin-top: 26rpx;
      transform: rotate(45deg);
      position: absolute;
    }

    /*图片消息*/
    .picture {
       160px;
    }

    /*回复框*/
    .reply {
      display: flex;
      flex-direction: row;
      justify-content: flex-start;
      align-items: center;
      position: fixed;
      bottom: 0;
       100%;
      height: 54px;
      border-top: 1px solid rgb(215, 215, 215);
      background: rgb(245, 245, 245);
    }

    .reply .voice-image {
       25px;
      height: 25px;
      margin-left: 3%;
    }

    /*文本输入或语音录入*/
    .reply .opration-area {
      flex: 1;
      padding: 8px;
    }

    /*回复文本框*/
    .reply input {
      background: rgb(252, 252, 252);
      height: 36px;
      border: 1px solid rgb(221, 221, 221);
      border-radius: 6px;
      padding-left: 3px;
    }

    /*选取图片*/
    .reply .choose-image {
       25px;
      height: 25px;
      margin-right: 3%;
    }

    /*按住说话button*/
    .voice-button {
      height: 36px;
      color: #818181;
      font-size: 14px;
      line-height: 36px;
    }

    /*悬浮提示框*/
    .hud-container {
      position: fixed;
       150px;
      height: 150px;
      left: 50%;
      top: 50%;
      margin-left: -75px;
      margin-top: -75px;
    }

    /*背景层*/
    .hud-background {
      position: absolute;
       100%;
      height: 100%;
      background: #999;
      opacity: .8;
      z-index: 11;
      border-radius: 10px;
    }

    /*悬浮框主体*/
    .hud-body {
      position: relative;
       100%;
      height: 100%;
      z-index: 19;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      align-items: center;
    }

    /*图标*/
    .hud-body image {
      margin-top: 20px;
       80px;
      height: 80px;
    }

    /*文字*/
    .hud-body .tip {
      color: #fff;
      text-align: center;
       90%;
      line-height: 34px;
      margin: 0 auto;
      margin-bottom: 10px;
       90%;
    }

    .hud-body .warning {
      background: #cc3333;
      border-radius: 5px;
    }
    ::-webkit-scrollbar{/*隐藏滚动条*/
    0;
    height: 0;
    color: transparent;
    }
     
    js:
    // chat.js
    // var app = getApp();
    var user_id = user_id
    var sender_id = sender_id
    var socketOpen = false;
    var frameBuffer_Data, session, SocketTask;
    var url = 'ws://www.yzhm8.com:8080';
    import Toast from "../../utils/toast";
    let chatInput = require('../../modules/chat-input/chat-input');
    let utils = require('../../utils/util');
    /**
    * 聊天输入组件展示页面
    */
    Page({

    /**
    * 页面的初始数据
    */
    data: {
    lastX: 0, //滑动开始x轴位置
    lastY: 0, //滑动开始y轴位置
    text: "没有滑动",
    currentGesture: 0, //标识手势
    textMessage: '',
    allContentList: [],
    chatItems: [],
    scroll_height: wx.getSystemInfoSync().windowHeight - 54,
    page_index: 0,
    mode: true,
    cancel: false,
    status: 0,
    toView: '',
    msg: '',
    receiver_ids: '',
    sender_ids: '',
    scrollTopTX: 'a4',//滚动位置
    dropDown:true,//切换滚动与刷新
    dropDown_id:false//只允许刷新一次
    },
    //滑动移动事件
    handletouchmove: function (event) {
    var currentX = event.touches[0].pageX
    var currentY = event.touches[0].pageY
    var tx = currentX - this.data.lastX
    var ty = currentY - this.data.lastY
    var text = ""
    //左右方向滑动
    if (Math.abs(tx) > Math.abs(ty)) {
    if (tx < 0)
    text = "向左滑动"
    else if (tx > 0)
    text = "向右滑动"
    }
    //上下方向滑动
    else {
    if (ty < 0)
    text = "向上滑动"
    else if (ty > 0)
    text = "向下滑动"
    }

    //将当前坐标进行保存以进行下一次计算
    this.data.lastX = currentX
    this.data.lastY = currentY
    this.setData({
    text: text,
    });
    },

    //滑动开始事件
    handletouchtart: function (event) {
    this.data.lastX = event.touches[0].pageX
    this.data.lastY = event.touches[0].pageY
    },
    //滑动结束事件
    handletouchend: function (event) {
    this.data.currentGesture = 0;
    this.setData({
    text: "没有滑动",
    });
    },
    Refresh: function () {
    var arr = res.data;
    for (var i = 0; i < arr.length; i++) {
    console.log(arr[i].content)
    arr[i].content = i
    }
    this.Refresh()
    },
    /**
    * 生命周期函数--监听页面加载
    */
    onLoad(options) {
    var that = this;
    var read_id = options.user_id
    var read_id = options.user_id;

    if (options.user_id == undefined) {
    wx.redirectTo({
    url: '/pages/Login/login',
    })
    return;
    }
    console.log(195, options)
    that.setData({
    // avatar:options.avatar_url,/*改 llp*/
    // sender_id: sender_id,
    user_id: wx.getStorageSync('user_id'),
    avatar_url: wx.getStorageSync('avatar'),
    receiver_ids: read_id.split(",")[0],
    sender_ids: read_id.split(",")[1]
    })
    wx.getStorage({///////////////////////////////////////取//////////////////////////////////////
    key: 'key01',
    success(res) {
    console.log(207, res)
    var arr = [];
    for (var i = 0; i < res.data.length; i++) {
    var myself = '';
    if (res.data[i].sender_id == that.data.user_id) {
    myself = 1;
    } else {
    myself = 0;
    }
    var itile = {
    myself: myself,
    head_img_url: that.data.avatar_url,
    msg: res.data[i].content,
    msg_type: 'text',
    myid: res.data[i].receiver_id,
    uid: res.data[i].sender_id,
    }
    arr.push(itile)
    }
    console.log('arr', arr)
    that.setData({
    allContentList: arr,
    dropDown: false,
    })
    setTimeout(function () {/*改 llp*/
    console.log('1111111111111111', arr.length)
    that.setData({
    scrollTopTX: 'row' + arr.length
    })
    }, 100)
    },
    })
    // wx.request({
    // url: 'https://ztmp.jjyg8.com/api/InstantMessaging/query_chat',
    // data:{
    // sender_id:sender_id,
    // receiver_id:user_id,
    // type:2
    // },
    // success: function (Tenarticle) {
    // console.log(Tenarticle,"Tenarticle")
    // wx.setStorage({
    // key: 'Tenarticle',
    // data: Tenarticle.data
    // })
    // }
    // })
    this.initData();
    // wx.getStorage({
    // key: 'Tenarticle',
    // success(Tenarticle) {
    // for(var t=0;t<Tenarticle.data.length;t++){
    // that.data.allContentList.unshift({
    // msg: Tenarticle.data[t].content,
    // uid: Tenarticle.data[t].sender_id,
    // myid: Tenarticle.data[t].receiver_id,
    // states: Tenarticle.data[t].states,
    // times:Tenarticle.data[t].times,
    // msg_type:"text",
    // head_img_url: that.data.avatar_url&&that.data.avatar,
    // myself:1&&0
    // })
    // }

    // }
    // })

    },

    // 页面加载完成
    onReady: function () {
    var that = this;
    var that_data = that.data
    var user_id = user_id
    SocketTask.onOpen(res => {
    socketOpen = true;
    console.log('监听 WebSocket 连接打开事件。', res)
    })
    SocketTask.onClose(onClose => {
    console.log('监听 WebSocket 连接关闭事件。', onClose)
    // socketOpen = false;
    this.webSocket()
    })
    SocketTask.onError(onError => {
    console.log('监听 WebSocket 错误。错误信息', onError)
    socketOpen = false
    })
    wx.onSocketMessage(onMessage => {
    console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', onMessage)
    var onMessage_data = onMessage.data
    var s = onMessage_data.substr(0, 1)
    var onMessage_s = onMessage_data.substr(2)
    if (s == 0) {
    wx.request({
    url: 'https://ztmp.jjyg8.com/api/InstantMessaging/bind',
    header: {
    'content-type': 'application/x-www-form-urlencoded'
    },

    data: {
    uid: that.data.user_id,
    client_id: onMessage_s
    },
    method: "POST",
    })

    } else {
    that.data.allContentList.push({
    myself: 0,
    head_img_url: that.data.avatar,
    msg_type: 'text',
    msg: this.data.onMessage.content,
    myid: that_data.user_id,
    uid: that_data.sender_ids,/*改 llp*/
    });
    that.setData({
    allContentList: that.data.allContentList,
    dropDown: false,
    })
    setTimeout(function () {/*改 llp*/
    console.log('1111111111111111')
    that.setData({
    scrollTopTX: 'row' + that.data.allContentList.length
    })
    }, 100)
    that.scrollToBottom();
    console.log(that.data.allContentList)
    }

    // if (onMessage_data.cmd == 1) {
    // that.setData({
    // link_list: text
    // })
    // console.log(text, text instanceof Array)

    // if (text instanceof Array) {
    // for (var i = 0; i < text.length; i++) {
    // text[i]
    // }
    // } else {

    // }

    // }
    })
    },
    onShow: function (e) {
    if (!socketOpen) {
    this.webSocket()
    }
    },
    webSocket: function () {
    // 创建Socket
    SocketTask = wx.connectSocket({
    url: url,
    data: 'data',
    header: {
    'content-type': 'application/json'
    },
    method: 'post',
    success: function (res) {
    console.log('WebSocket连接创建', res)
    },
    fail: function (err) {
    wx.showToast({
    title: '网络异常!',
    })
    console.log(err)
    },
    })
    },
    initData() {
    let that = this;
    let systemInfo = wx.getSystemInfoSync();
    chatInput.init(this, {
    systemInfo: systemInfo,
    minVoiceTime: 1,
    maxVoiceTime: 60,
    startTimeDown: 56,
    format: 'mp3', //aac/mp3
    sendButtonBgColor: 'mediumseagreen',
    sendButtonTextColor: 'white',
    extraArr: [{
    picName: 'choose_picture',
    description: '照片'
    }, {
    picName: 'take_photos',
    description: '拍摄'
    }],
    // tabbarHeigth: 48
    });

    that.setData({
    pageHeight: systemInfo.windowHeight,
    });
    wx.setNavigationBarTitle({
    title: '好友'
    });
    that.textButton();
    that.extraButton();
    // that.voiceButton();
    },
    textButton() {
    var that = this;
    var that_data = that.data
    console.log(that)
    console.log(that_data)
    //console.log(user_id)
    chatInput.setTextMessageListener(function (e) {
    let msg = e.detail.value;
    if (msg == '') {
    wx.showToast({
    title: '总要写点什么吧'
    });
    return;
    }

    var message = {
    myself: 1,
    head_img_url: that.data.avatar_url,
    msg_type: 'text',
    msg: msg,
    myid: that_data.user_id,
    uid: that_data.sender_id,
    }
    console.log(that.data)
    if (socketOpen) {
    that.data.allContentList.push(message);
    that.setData({
    dropDown: false,
    })
    setTimeout(function () {/*改 llp*/
    console.log('1111111111111111')
    that.setData({
    scrollTopTX: 'row' + that.data.allContentList.length
    })
    }, 100)
    sendSocketMessage(
    wx.request({
    url: 'https://ztmp.jjyg8.com/api/InstantMessaging/send',

    data: {
    uid: message.uid,
    sendname: 10101,
    img: '11111',
    content: msg,
    sendid: message.myid
    },
    success: function (res) {
    console.log(res.data)
    that.setData({
    items: res.data
    })
    },
    }),


    // msg: msg,
    // // myid: 100,
    // uid: 100,
    )
    if (that.row == 1) {
    wx.request({
    url: 'https://ztmp.jjyg8.com/api/InstantMessaging/Message_warehousing',
    data: {
    receiver_id: message.uid,
    sender_id: message.myid,
    content: message.msg,
    states: 2,
    }
    })
    }
    // wx.sendSocketMessage({
    // data: message,
    // })
    that.setData({
    allContentList: that.data.allContentList,
    dropDown: false,
    msg: '' // 清空输入框文本
    })
    setTimeout(function () {/*改 llp*/
    console.log('1111111111111111')
    that.setData({
    scrollTopTX: 'row' + that.data.allContentList.length
    })
    }, 100)
    that.scrollToBottom();
    }
    })
    },
    extraButton() {
    let that = this;
    chatInput.clickExtraListener(function (e) {
    console.log(e);
    let itemIndex = parseInt(e.currentTarget.dataset.index);
    // if (itemIndex === 2) {
    // that.myFun();
    // return;
    // }
    wx.chooseImage({
    count: 1, // 默认9
    sizeType: ['compressed'],
    sourceType: itemIndex === 0 ? ['album'] : ['camera'],
    success: function (res) {
    let tempFilePath = res.tempFilePaths[0];
    wx.uploadFile({
    url: 'https://oss.jjyg8.com',
    filePath: tempFilePaths[0],
    name: 'file',
    formData: {
    name: tempFilePaths[0],
    key: "img/${filename}",
    policy: "eyJleHBpcmF0aW9uIjoiMjAyMC0wMS0wMVQxMjowMDowMC4wMDBaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF1dfQ==",
    OSSAccessKeyId: "LTAIn3MQVumdpEws",
    success_action_status: "200",
    signature: "6NqEga8RuDFjBox9jMfCel1GjZE=",
    },
    success: function (res) {
    console.log(res)
    that.setData({
    img: tempFilePaths[0].replace("http://tmp", "https://oss.jjyg8.com/img")
    })
    },
    fail: function ({ errMsg }) {
    console.log('upladImage fail, errMsg is: ', errMsg)
    wx.showToast({
    title: "上传失败",
    duration: 1000
    })
    },
    })

    var message =
    {
    myself: 1,
    head_img_url: that.data.avatar_url,
    msg_type: 'image',
    msg: tempFilePath,
    myid: that.data.user_id,/*改 llp*/
    uid: that.data.sender_ids,
    create_time: utils.formatTime(new Date())
    }
    that.data.allContentList.push(message);
    that.setData({
    'inputObj.extraObj.chatInputShowExtra': false
    });
    sendSocketMessage(message)
    that.setData({
    allContentList: that.data.allContentList,
    dropDown: false,
    msg: '' // 清空输入框文本
    })
    setTimeout(function () {/*改 llp*/
    console.log('1111111111111111')
    that.setData({
    scrollTopTX: 'row' + that.data.allContentList.length
    })
    }, 100)
    that.scrollToBottom();
    }
    });
    });

    chatInput.setExtraButtonClickListener(function (dismiss) {

    console.log('Extra弹窗是否消失', dismiss);
    })
    },

    resetInputStatus() {
    chatInput.closeExtraView();
    },
    scrollToBottom: function () {
    this.setData({
    toView: 'row_' + (this.data.allContentList.length - 1)
    });
    console.log(this.data)
    },
    // // 下拉刷新
    onPullDownRefresh: function () {
    console.log(488,'下拉')
    // // 显示顶部刷新图标
    wx.showNavigationBarLoading();
    var that = this;
    if (!that.data.dropDown_id){
    wx.request({
    url: 'https://ztmp.jjyg8.com/api/InstantMessaging/query_chat',
    data: {
    receiver_id: that.data.sender_ids,/*改 llp*/
    sender_id: that.data.user_id,
    type: 3
    },
    success: function (browsed) {
    var arr = [];
    var myself = ';'
    for (var i = 0; i < browsed.data.length; i++) {
    if (browsed.data[i].sender_id == that.data.user_id) {
    myself = 1
    } else {
    myself = 0
    }
    var itile = {
    myself: myself,
    head_img_url: that.data.avatar_url,
    msg: browsed.data[i].content,
    msg_type: 'text',
    myid: browsed.data[i].receiver_id,
    uid: browsed.data[i].sender_id,
    }
    arr.push(itile)
    }
    for (var i = 0; i < that.data.allContentList.length; i++) {
    arr.push(that.data.allContentList[i])
    }
    that.setData({
    allContentList: arr,
    dropDown_id:true,/*改 llp*/
    dropDown: false,
    })
    // setTimeout(function () {/*改 llp*/
    // console.log('1111111111111111')
    // that.setData({
    // scrollTopTX: 'row' + arr.length
    // })
    // }, 100)
    // 隐藏导航栏加载框
    wx.hideNavigationBarLoading();
    // 停止下拉动作
    wx.stopPullDownRefresh();
    }
    })
    }else{
    this.setData({
    dropDown: false,
    })
    // 隐藏导航栏加载框
    wx.hideNavigationBarLoading();
    // 停止下拉动作
    wx.stopPullDownRefresh();
    wx.showToast({
    title: '已查询所有记录',
    icon: 'success',
    duration: 2000
    })
    }
    },
    upper(){//滚动到顶部
    console.log('滚动到顶部')
    this.setData({
    dropDown: true,
    })
    },
    lower(){//滚动到底部
    console.log('1212312312313')
    this.setData({
    scrollTopTX: 'row' + this.data.allContentList.length
    })
    },
    downTouchmove(){
    this.setData({
    dropDown: false,
    })
    }
    });
    //通过 WebSocket 连接发送数据,需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。
    function sendSocketMessage(msg) {
    var that = this;
    SocketTask.send({
    data: JSON.stringify(msg)
    }, function (res) {
    console.log('已发送', res)
    })
    }
  • 相关阅读:
    兼容ie6的ul水平居中对齐
    button小手设置 css的cursor
    virtualbox xp连不上网
    转发与重定向的区别(forward与redirect的区别)
    注册表单输入框检测
    html中块元素的居中。及兼容性
    centos下不重装php——给PHP添加新扩展库
    linux编译安装时常见错误解决办法
    Swift可选链
    jQueryMobile(一)
  • 原文地址:https://www.cnblogs.com/2500486123llp/p/10087444.html
Copyright © 2020-2023  润新知