mpvue踩坑记录,关于QT的QCombox的掉坑出坑

by admin on 2019年4月6日

 
 近期项目中付出在用到QCombox,但是在付出中,踩到了多少个坑,花了1个夜间,一贯在想,辛亏终极找到难题所在了。

 
 近年来项目中耗费在用到QCombox,然则在付出中,踩到了3个坑,花了1个夜间,一向在想,幸而最后找到难题所在了。

至于QT的QCombox的掉坑出坑,qtqcombox掉坑

 
 近年来项目中付出在用到QCombox,可是在付出中,踩到了三个坑,花了二个夜晚,一向在想,幸亏最终找到难点所在了。

home88一必发 1

那是业务的流程。直接说重点:QCombox在下拉窗更新数据的时候,会暗中同意把下拉窗的首先个条数据,设置为当选的景观,那样的话,就会发出curentTextChanged的三个非非确定性信号,直接把逻辑层原先有的数据给修改了。

mpvue踩坑记录,关于QT的QCombox的掉坑出坑。  为此,举行了日记打印一探毕竟:

void TalkWindow::getMicList(const QStringList & texts)
{

 DEBUG_TRACE("getCurrentText %s" , m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 if (m_pDeviceWidget == NULL) return;
 m_pDeviceWidget->m_pMicrophoneCombox->clear();
 int a = m_pDeviceWidget->m_pMicrophoneCombox->count();
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText1 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->addItems(texts);
 DEBUG_TRACE("getCurrentText2 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 m_pDeviceWidget->m_pMicrophoneCombox->insertItem(texts.size()+1, TR_TALK_DEVICE_COMBOX, 0);
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText3 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText4 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText!!!!! %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
}

   日志显如下:

 Line 151: [D:TalkWindow+13100:10356] 23:05:55.942 101261.059234 getCurrentText 麦克风 (7.1 SOUND EFFECT GAMING HEADSET)
 Line 152: [D:TalkWindow+13100:10356] 23:05:55.943 101261.059569 getCurrentText1 
 Line 155: [D:TalkWindow+13100:10356] 23:05:55.943 101261.060339 getCurrentText2 麦克风 (High Definition Audio 设备)
 Line 156: [D:TalkWindow+13100:10356] 23:05:55.944 101261.060662 getCurrentText3 
 Line 157: [D:TalkWindow+13100:10356] 23:05:55.944 101261.060866 getCurrentText4 
 Line 158: [D:TalkWindow+13100:10356] 23:05:55.944 101261.061036 getCurrentText!!!!! 

在getCurrentText2的日志中,很明显,把additems的数据加载完完,默认选中就变了,然后再执行 setCurrentIndex的时候,把默认选中置为空,也就是说,一共产生了两次 textchange的信号。

解决办法:
  我目前的解决办法是,在获取数据的时候,先断开信号槽的连接,disconnect函数,然后等把下拉窗的数据加载完,再connect函数连接上,这样,加载数据就避免了发送两次信号,修改原有的数据。当然也
可以一个标记bool值,信号发出去的时候,不去处理就好了,但是这样的话,可能不太好控制。所以我选择了前者。有更好的办法,多多指教。

方今项目中付出在用到QCombox,但是在开发中,踩到了四个坑,花了一个夜间,一向在想,辛亏最后…

新近卖家初步做小程序项目,因为前面比较熟悉vue,不太想为小程序专门再去学习她那套语法了,所以找了美团团队开源的mpvue作为消除方案mpvue具体景况可以看github上边的合法文书档案:mpvue文书档案

home88一必发 2

home88一必发 3

mpvue原理:大约原理正是他们改变了compile文件,将大家写的vue文件重新编写翻译成wxml等公事,最终的最底层落成照旧用的小程序语法,mpvue只是能让您使用相比熟悉的vue语法开发而已,所以中级肯定有为数不少vue和小程序之间的反差须求在开发的时候注意的

这是事情的流程。直接说根本:QCombox在下拉窗更新数据的时候,会暗中认可把下拉窗的率先个条数据,设置为当选的场合,那样的话,就会发出curentTextChanged的3个复信号,直接把逻辑层原先有的数据给修改了。

那是事情的流水生产线。直接说重点:QCombox在下拉窗更新数据的时候,会暗许把下拉窗的首先个条数据,设置为当选的事态,那样的话,就会发生curentTextChanged的叁个实信号,直接把逻辑层原先有的数据给修改了。

上面说说开发过程中会遇到的题材

  为此,进行了日志打字与印刷1探究竟:

  为此,举行了日志打字与印刷壹探究竟:

页面配置

第2说下页面配置,mpvue的默许页面须要一个xx.vue单页面组件,同时相配上一个main.js文件,也等于说每新建3个页面都须要这么三个文本,而且main.js中的东西为主重复,显得比较冗余

此地推荐1个第二方的插件:mpvue-entry

mpvue踩坑记录,关于QT的QCombox的掉坑出坑。该插件使得我们新建页面时只供给2个xx.vue文件,并且将页面路由通过2个js文件统1配备(符合vue开发的习惯),不用再放置在main.js中了

专门提醒:该插件的版本请使用0.xx的本子,一.xx的本子与当下的mpvue有抵触

void TalkWindow::getMicList(const QStringList & texts)
{

 DEBUG_TRACE("getCurrentText %s" , m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 if (m_pDeviceWidget == NULL) return;
 m_pDeviceWidget->m_pMicrophoneCombox->clear();
 int a = m_pDeviceWidget->m_pMicrophoneCombox->count();
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText1 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->addItems(texts);
 DEBUG_TRACE("getCurrentText2 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 m_pDeviceWidget->m_pMicrophoneCombox->insertItem(texts.size()+1, TR_TALK_DEVICE_COMBOX, 0);
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText3 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText4 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
 m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
 DEBUG_TRACE("getCurrentText!!!!! %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
}
void TalkWindow::getMicList(const QStringList & texts)
{

    DEBUG_TRACE("getCurrentText %s" , m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
    if (m_pDeviceWidget == NULL) return;
    m_pDeviceWidget->m_pMicrophoneCombox->clear();
    int a = m_pDeviceWidget->m_pMicrophoneCombox->count();
    m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
    DEBUG_TRACE("getCurrentText1 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
    m_pDeviceWidget->m_pMicrophoneCombox->addItems(texts);
    DEBUG_TRACE("getCurrentText2 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
    m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
    m_pDeviceWidget->m_pMicrophoneCombox->insertItem(texts.size()+1, TR_TALK_DEVICE_COMBOX, 0);
    m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
    DEBUG_TRACE("getCurrentText3 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
    m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
    DEBUG_TRACE("getCurrentText4 %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
    m_pDeviceWidget->m_pMicrophoneCombox->setCurrentIndex(-1);
    DEBUG_TRACE("getCurrentText!!!!! %s", m_pDeviceWidget->m_pMicrophoneCombox->currentText().toStdString().c_str());
}

路由转跳

因为小程序与vue的路由机制的异样,所以大家无奈使用vue-router来达成路由转跳(因为vue页面转跳后,在此之前的页面会销毁;小程序在页面转跳后,在此之前的页面不会被灭绝,而是转入后台;)如若您必要采纳类似vue的api来兑现(恐怕有点项目想将已有vue代码直接编写翻译成小程序)那里推荐二个第1方插件:mpvue-router-patch可是那几个插件只是包装了着力的用法,假使想要使用景况相比较复杂大概要求协调包裹

   日志显如下:

   日志显如下:

生命周期钩子

因为小程序的历史页面不会销毁,所以在生命周期的选用中有亟待专注的点

  • created:那一个钩子是有bug的,全数页面包车型客车created函数会在类型加载的时候被一起调用,而且进入页面包车型地铁时候不会在被调用,所以这一个函数基本就不可能选取了,用小程序的onLoad钩子代替吗
  • mounted:你假诺从页面B再次回到页面A,页面A的mounted钩子不会被触发,因为页面未有被再度加载,假使有必要每一遍页面显示都要调用的逻辑,使用小程序的onShow代替吧其余的钩一时还未有品味过,后续有坑再补上
 Line 151: [D:TalkWindow+13100:10356] 23:05:55.942 101261.059234 getCurrentText 麦克风 (7.1 SOUND EFFECT GAMING HEADSET)
 Line 152: [D:TalkWindow+13100:10356] 23:05:55.943 101261.059569 getCurrentText1 
 Line 155: [D:TalkWindow+13100:10356] 23:05:55.943 101261.060339 getCurrentText2 麦克风 (High Definition Audio 设备)
 Line 156: [D:TalkWindow+13100:10356] 23:05:55.944 101261.060662 getCurrentText3 
 Line 157: [D:TalkWindow+13100:10356] 23:05:55.944 101261.060866 getCurrentText4 
 Line 158: [D:TalkWindow+13100:10356] 23:05:55.944 101261.061036 getCurrentText!!!!! 

在getCurrentText2的日志中,很明显,把additems的数据加载完完,默认选中就变了,然后再执行 setCurrentIndex的时候,把默认选中置为空,也就是说,一共产生了两次 textchange的信号。

解决办法:
  我目前的解决办法是,在获取数据的时候,先断开信号槽的连接,disconnect函数,然后等把下拉窗的数据加载完,再connect函数连接上,这样,加载数据就避免了发送两次信号,修改原有的数据。当然也
可以一个标记bool值,信号发出去的时候,不去处理就好了,但是这样的话,可能不太好控制。所以我选择了前者。有更好的办法,多多指教。
    Line 151: [D:TalkWindow+13100:10356] 23:05:55.942 101261.059234 getCurrentText 麦克风 (7.1 SOUND EFFECT GAMING HEADSET)
    Line 152: [D:TalkWindow+13100:10356] 23:05:55.943 101261.059569 getCurrentText1 
    Line 155: [D:TalkWindow+13100:10356] 23:05:55.943 101261.060339 getCurrentText2 麦克风 (High Definition Audio 设备)
    Line 156: [D:TalkWindow+13100:10356] 23:05:55.944 101261.060662 getCurrentText3 
    Line 157: [D:TalkWindow+13100:10356] 23:05:55.944 101261.060866 getCurrentText4 
    Line 158: [D:TalkWindow+13100:10356] 23:05:55.944 101261.061036 getCurrentText!!!!! 

在getCurrentText2的日志中,很明显,把additems的数据加载完完,默认选中就变了,然后再执行 setCurrentIndex的时候,把默认选中置为空,也就是说,一共产生了两次 textchange的信号。

解决办法:
  我目前的解决办法是,在获取数据的时候,先断开信号槽的连接,disconnect函数,然后等把下拉窗的数据加载完,再connect函数连接上,这样,加载数据就避免了发送两次信号,修改原有的数据。当然也
可以一个标记bool值,信号发出去的时候,不去处理就好了,但是这样的话,可能不太好控制。所以我选择了前者。有更好的办法,多多指教。

组件

  • 子组件中更新数据后,页面无法进展对应的渲染的情事消除措施:在你的data中不管放入一个变量就好了

export default { return { data () { any: '' } }}

原因分析:后来察觉因为小编子组件中的数据数组时从父组件传入的,只在props中收到,data中央直属机关接是空的,随后无意中发现只要在data中放入二个变量就能正常更新了;疑忌是还是不是因为将vue组件编写翻译成小程序组件的进程中,Vue实例的data与小程序Page实例的data同步的时候存在bug

  • slot难点slot一时只好够传递固定内容,父组件那边传递变量,子组件中不可能进行渲染

// 父组件<children> <div>slot内容<div> <div>{{list.data}}</div></children>// 子组件<div> <slot></slot><div>// 页面展示效果<view> <view>slot内容</view> <view></view> // 此处无法展示出来</view>
  • 选取小程序组件使用小程序组件的时候,变量与办法的绑定须要接纳vue的主意,比如点击事件,小程序是bindtap="btnClick",而我辈须求使用@click="btnClick"去落到实处,mpvue文书档案也有关系;实际尝试下来,基本上方法绑定就把小程序的bind去掉,前边加上@就好

v-for

列表渲染的时候,微信开发者工具中只怕会产出双倍的标签,那几个有趣的事是开发者工具自个儿的bug,测试下来一时不会潜移默化意义

下拉刷新&上拉加载

推荐下拉加载与上拉刷新使用全局的api去贯彻

export default { return { data () {} }, onPullDownRefresh () { // 下拉刷新 }, onReachBottom () { // 上拉加载 }}

特别注意:

  1. 大局的下拉加载须求在布局中设置开启
  2. 再正是需求在措施中调用wx.stopPullDownRefresh()方法截至下拉动作,不然在真机上边下拉成效无法接收

home88一必发 ,只要选取scroll-view标签实现,有多少个地点要求证美赞臣(Meadjohnson)下:

  1. 接触方法必要停放methods中,并且绑定在scroll-view标签上调用
  2. 在scroll-view中下拉的时候,无法接触全局的下拉遵守,需求协调完成相应的卡通(所以提出优先选取全局的法子)
  3. 下拉刷新唯有在滑行至顶部的时候才会触发,假使您的滚动条已经在标签区域最顶部了,就不能够接触下拉办法(那点是最终抛弃scroll-view的主要缘由,处理起来太费事了)

请求

和后端的数额交互,能够利用flyio那一个插件:flyio-github文书档案在那边:flyio文档因为该插件包容八个框架,所以要小心在小程序中的调用格局

import Fly from "flyio/dist/npm/wx"const fly = new Fly()

专门表达:此间说下,小程序中负有的历史观拍卖请求的插件,比如axios,$.ajax等等,因为依靠window对象的xmlHttpRequest
api,都不得以行使,因为小程序中没有window对象flyio重写了非浏览器环境的Http
Engine,所以达成了多端包容

拦截器:付出进程中,平常会必要对请求进行拦截,做统壹的拍卖flyio1样能够运用拦截器:拦截器文书档案

计划表明:内需在后台的可靠任域名中安顿请求的地方,且只支持https请求假若是付出调节和测试的情景,能够在开发者工具中,勾选不校验域名,就会绕过检查测试

数据埋点

应用的腾讯MTA,有原始的小程序支持下载SDK,依照文档使用就行了:腾讯MTA小程序文书档案

上述,是笔者当下利用mpvue的叁个等级计算,后续会持续更新,借使喜欢,不吝点赞,多谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图