前端开发_快应用开发

news2024/9/27 5:36:34

目录

      • 快应用官网
      • 真机调试
      • 组件
        • 组件嵌套问题
        • tab组件
        • list组件
        • web组件
      • css 样式问题
        • [1]选择器
        • [2]盒模型
        • [3]样式布局-弹性布局
        • [4-1]样式切换 - 类名的动态切换
        • [4-2] 样式切换 - 行内样式动态切换
        • [5]background
        • [6]overflow
        • [7]border-radius
        • [8]盒子阴影
        • [9] 单位
      • 系统接口
        • [1] 检查某app是否在手机上安装
        • [2] 下载应用
        • [3] 检查当前是否有桌面应用
        • [4] 添加桌面应用
        • [5]数据存储
        • [6]弹框
        • [7] 接口
      • 公共对象
        • global对象
        • $app
          • 退出快应用
        • $element
          • 获取指定element元素
      • manifest配置文件
        • config - 系统配置信息
          • designWidth - 项目配置基准宽度
          • data - 全局数据对象
        • router - 配置路由
          • entry
          • pages
      • 问题
        • 问题1-IDE打开是英文

  • 点击其他地方关闭弹框
  • 全局变量 blobal
  • Scheme协议

快应用官网

快应用官网

真机调试

在开发快应用时,需要进行真机调试,因为在模拟器上很多效果都不正确,所以需要以真机为主。

  • 方法1: 远程预览
    • 直接微信扫(远程预览)二维码进入调试模式
  • 方法2: 使用调试器调试
    • [1]在快应用调试器下载地址下载快应用调试器 与 快应用预览版;
    • [2] 点击如下二维码icon打开二维码并扫描二维码可正常在手机上进行调试
      在这里插入图片描述
  • 方法2的优势是在运行的时候若是逻辑错误可以看到运行报错,有助于我们解决问题。
    比如说我在逻辑代码中使用了window对象进行事件监听,在远程预览时功能不能正常运行,但是定位不到问题的原因,使用调试器进行调试可以看到错误,能快速定位问题---- 没有window对象。

组件

组件嵌套问题

  • [1] 文本必须包裹在 text组件或span组件中,否则不显示;
  • [2] span必须作为text/a/span组件的子组件,否则不显示;

tab组件

tab组件中的tab-content中的数据不支持动态增加或减少!如果要减少页面,需要先销毁掉,重新用新的实例展示数据 ===> 快应用提供了if命令,if为false时,页面不显示,并且dom节点也会移除。

<tab if='bol'>
  <tab-bar></tab-bar>
  <tab-content></tab-content>
</tab>

但是这样将会导致每次切换tab数据加载时 tab-bar的滚动条都会滚动到初始位置(最左边),而且数据加载中tab-bar数据也会暂时消失 ===> 用户体验感不好;
我们可以只使用tab-bar来显示滚动条的tab数据,底部content内容使用普通组件div进行显示!

list组件

list-item — type属性必填 不然list不会滚动

web组件

由于快应用开发存在很多样式兼容问题,开发过程不是很顺利,我们可以使用其他框架开发web页面,然后通过web组件引入其他线上页面

<web src='http://baidu.com'></web>

css 样式问题

快应用中对于很多css样式都不兼容, 我们按照平常的习惯进行样式布局,在真机调试的时候发现样式是错乱的!


下面针对一些不兼容样式进行说明~

[1]选择器

  • 支持标签选择器、类选择器、id选择器,暂不支持其它选择器;
  • 继承:不支持样式继承;

[2]盒模型

快应用布局框架使用 border-box 模型,暂不支持 content-box 模型与手动指定 box-sizing 属性。

[3]样式布局-弹性布局

在快应用中很多组件默认采用的都是 弹性布局的方式进行布局,div组件是比较常用的弹性布局方式布局的元素。

  • 弹性布局不可以取消 ! ===> 在快应用中display只有flex与none取值情况,
      display: flex ; // 弹性布局
      display: none; //  消失
    
  • 若是不想子元素在一行排列 可以使用修改主轴方向
      flex-direction: column;
    
  • 注意:在弹性布局中 ===> 若是子元素的高度/宽度总和大于父元素的高度或宽度,不会出现滚动条,而是子元素的宽/高 收缩。

[4-1]样式切换 - 类名的动态切换

在很多情况下,我们需要通过动态切换类型来改变元素的的样式,在快应用中注意,切换类名时,类名必须在目标元素上,不然没效果!
比如设置在父元素上

.active{
  text{
    color: red; // 没效果
  }
}

我给text的父元素添加active类名然后修改text元素文本的颜色,但是发现没有效果;但是把类名动态添加在text标签上就发现样式可以正常切换了。

.active{
  color:red;
}

[4-2] 样式切换 - 行内样式动态切换

行内样式不支持动态编写 ----> 可以使用computed或methods

 <div style='{{background-image:url(imgurl)}}' class='www'></div>
  private:{
    imgurl: 'https://martin-upload.wcar.net.cn/web/2021/11/6bbf95698459f15b0050cb0d8e9e3484.png'
  }

上述代码不能正常显示图片,个人猜测是因为识别不出变量imgurl,若是想样式中的数据动态切换,可以采用computed与methods

  <div style="{{returnStatusImage()}}"  class='www'></div>
private: {
   text: '快应用是什么?',
   status:0
},
returnStatusImage() {
   switch (this.status) {
     case 0:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2021/11/6bbf95698459f15b0050cb0d8e9e3484.png)'
       break;
     case 1:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2021/11/07167f84c6dbf2679a6b1744acdd6ae9.png)'
       break;
     case 2:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2021/11/743cbd9439d241cb6c8af9aeb85b312e.png)' 
       break;
     case 3:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2021/12/5459fe6f0978ca211dc7034b903547c2.png)'
       break;
     case -1:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2021/12/5459fe6f0978ca211dc7034b903547c2.png)'
       break;
     case 4:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2022/02/9ff11fe02d56737ed45dec1ff626a194.jpg)'
       break;
     default:
       return 'background-image:url(https://martin-upload.wcar.net.cn/web/2021/11/6bbf95698459f15b0050cb0d8e9e3484.png)'
   }
 },

[5]background

  • 在快应用中background属性的作用是用来设置渐变色的,不能作为背景的复合属性。
    • 起作用
      background: linear-gradient(53deg, #F0E6D5 0%, #F0DFC3 100%);
      
    • 无作用
      background: red;
      
    • 若是想设置颜色使用background-color
        background-color:red;
      
  • span组件添加背景色不起作用!若是想要设置背景色不要使用span组件

[6]overflow

在快应用中overflow可接受的属性值如下

overflow: visible; // 显示
overflow: hidden; // 隐藏

因此没有办法设置元素显示滚动条等

[7]border-radius

在快应用中border-radius只接受一个值作为属性值

  • 若是设置2/3/4个值,则会报出警告
    border-radius:30px 20px 10px 0; // 四个圆角都会设置为30px
    
    不支持px 20px 10px 0作为单位,在编译时会将第一个值后面的值看作为单位
  • 设置4个一样的值
    border-radius:30px 20px 10px 0; // 四个圆角都会设置为30px
    
  • 若是想四个圆角弧度不一致
    border-top-left-radius:30px; // 左上
    border-top-right-radius:30px; // 右上
    border-bottom-left-radius:30px; //  左下
    border-bottom-right-radius:30px; // 右下
    

[8]盒子阴影

快应用中不支持盒子阴影。

[9] 单位

快应用中支持 px % dp单位;但是%单位在真机中显示不对!

系统接口

在项目中使用到的接口都需要在配置文件manifest.json中声明,不然会报如下警告

[WARN] 请在 manifest.json 文件里声明项目代码中用到的接口: system.storage, service.account, system.package, system.webview

[1] 检查某app是否在手机上安装

  • 官方文档:官方文档
  • 接口: system.package的hasInstalled方法
  • 作用:检查某app是否在已经在手机上安装
  • 使用
    • [1] 接口声明- 在配置文件manifest.json中声明
      "features": [
        {
          "name": "system.package" 
        },
      ]
      
    • [2] 在需要的地方导入并使用
        import pkg from '@system.package'
      
      pkg.hasInstalled({
        package: 'app包名',
        success: function(data) {
          console.log(`handling success: ${data.result}`)
          // result为true表示app已安装
          // result为false表示app未安装
        },
       fail: function(data, code) {
         console.log(`handling fail, code = ${code}`)
        }
      })
      

[2] 下载应用

  • 官方文档:官方文档
  • 接口: system.package的install方法
  • 作用:下载某app
  • 使用
    • [1] 接口声明- 在配置文件manifest.json中声明
      "features": [
        {
          "name": "system.package" 
        },
      ]
      
    • [2] 在需要的地方导入并使用
      import pkg from '@system.package'
      
      pkg.install({
        package: '应用包名',
       success: function(data) {
         console.log(`handling success: ${data.result}`)
         // result:true 下载成功
         // result: false 下载失败
       },
       fail: function(data, code) {
         console.log(`handling fail, code = ${code}`)
       }
      })
      

[3] 检查当前是否有桌面应用

  • 官方文档:官方文档
  • 接口: system.shortcut的hasInstalled方法
  • 作用:检查某app当前是否有桌面应用
  • 使用
    • [1] 接口声明- 在配置文件manifest.json中声明
      "features": [
        {
          "name": "system.shortcut" 
        },
      ]
      
    • [2] 在需要的地方导入并使用
      import shortcut from '@system.shortcut'
      
      shortcut.hasInstalled({
       success: function(res) {
         // res 为true表示已创建图标
         // res weifalse表示未创建图标
       }
      })
      

[4] 添加桌面应用

  • 官方文档:官方文档
  • 接口: system.shortcut的install方法
  • 作用:为某app添加桌面应用
  • 使用
    • [1] 接口声明- 在配置文件manifest.json中声明
      "features": [
        {
          "name": "system.shortcut" 
        },
      ]
      
    • [2] 在需要的地方导入并使用
      import shortcut from '@system.shortcut'
      
      shortcut.install({
        success: function() {
          console.log('handling success') // 创建成功
        },
        fail: function(data, code) {
         // 创建失败,请在设置中开启创建桌面应用权限
         console.log(`handling fail, code = ${code}, errorMsg=${data}`)
        }
      })
      

[5]数据存储

  • 官方文档:官方文档

[6]弹框

  • 官方文档:官方文档
  • 弹出框一共有三种
    • toast提示框
    • dialog对话框
    • 列表框

[7] 接口

  • 官方文档:官方文档
  • 请求封装
    import { fetch } from "@system.fetch";
    import { getStorage, setStorage } from './storage'
    const api = 'xxx' 
    
    const hasToken = async () => {
       const token = await getStorage('token')
       return !!token
    }
    
    // 将与后端约定的数据统一添加在请求头中
    const getHeaders = async () => {
       const token = await getStorage('token')
       return {
           token,
           ....
       }
    }
    
    export const httpGet = async (url, data = {}, header = {}) => {
     await hasToken()
     const headers = await getHeaders()
     return new Promise((resolve, reject) => {
       fetch({
         url: api + url,
         data,
         method: 'GET',
         responseType: 'json',
         header: {
           ...headers,
           ...header
         },
         success(data) {
           resolve(data.data)
         },
         fail(err) {
           reject(err)
         }
       })
     })
    }
    
    export const httpPost = async (url, data = {}, header = {}) => {
     await hasToken()
     const headers = await getHeaders()
     return new Promise((resolve, reject) => {
       fetch({
         url: api + url,
         data,
         method: 'POST',
         responseType: 'json',
         header: {
           ...header,
           ...headers
         },
         success(data) {
           if (data.data.status === 1004) {
             router.replace({
               uri: '/pages/Login'
             })
           } else {
             resolve(data.data)
           }
             
         },
         fail(err) {
           reject(err)
         }
       })
     })
    }
    
    export default {
     httpGet,
     httpPost
    }
    
    

公共对象

global对象

在快应用中global对象可以直接使用,我们可以将封装的公共方法添加在global对象上(类似于将封装的公共方法添加在vue实例化对象上)

$app

退出快应用
this.$app.exit() // 退出开应用,结束应用生命周期

$element

获取指定element元素
  • 获取指定 id 的组件 dom 对象,如果没有指定 id,则返回根组件 dom 对象用法
    this. $element('id名')
    
  • 获取元素的宽高
     element.getBoundingClientRect({
       success: data =>{
         // data中包含元素的宽高 ,left\right\bottom\top
       }
     })
    

manifest配置文件

manifest配置文件

config - 系统配置信息

designWidth - 项目配置基准宽度

与传统 web 页面不同,px是相对于项目配置基准宽度的单位,已经适配了移动端屏幕,其原理类似于rem。

设计稿1px / 设计稿基准宽度 = 框架样式1px / 项目配置基准宽度

  • 语法
    "config":{
      "designWidth": 750
    }
    
    若是不设置,默认值为750
  • 举例说明
    在这里插入图片描述
data - 全局数据对象

属性名不能以$_开头,在页面中可通过 this 进行访问;如果全局数据属性与页面的数据属性重名,则页面初始化时,全局数据会覆盖页面中对应的属性值

router - 配置路由

文件的目录结构如下:

src
  — pages
         — Demo
                 — index.ux
         — DemoDetail
                 — index.ux
          — Test
                 — test.ux
                 — test2.ux

在这里插入图片描述

entry

entry的属性值必须为pages中的一个。

pages
pages:{
  "页面名称":{
    "conponent": ' 文件夹名',
    "path": "路径名"
  }
}
  • 注意事项1: 页面配置列表(key值为指定页面名称(页面对应的文件夹目录),value为页面详细配置; key值唯一)

    • 若是同一文件夹下存在多个文件,此时不能为该文件下的多个文件进行路由匹配

       "pages/Test": {
          "component": "test",
          "path": "/test1"
        },
        "pages/Test": {
          "component": "test2",
          "path": "/test2"
        }
      

      我想为同一文件夹下的文件匹配多个路由,此时会报错 Duplicate object key(重复配置)

      因此不要为同一文件夹的文件配置路由

    • 通过路由的路径可以看出,(在没有添加path属性的情况下)路径只到指定的文件夹而不包含文件名,因此即使是component属性值不同路由的路径也是相同的!

       "pages/Test": {
          "component": "test"
        }
      

      这个配置之后的路径是’pages/Test’

       "pages/Test": {
          "component": "test2"
        }
      

      这个配置之后的路径也是’pages/Test’

  • 注意事项2: 若是在定义单个路由信息时,存在path属性,属性值前面一定要加/表示当前在src文件夹下。

    • 在定义单个路由信息时,若是没有添加对应的path属性时,页面名称就是对应的路径名

      "pages": {
        "pages/DemoDetail": {
          "component": "index"
      }
      

      当url为’/pages/DemoDetail’就会跳转到该页面了,此时location.href的值为

      http://localhost:8083/preview/pages/DemoDetail/

    • 若是添加了path属性,页面的路径将会以path的属性值为准

      "pages/DemoDetail": {
         "component": "index",
         "path": "/detail"
       }
      

      此时当url为’detail’或’/detail’时都会跳转到该页面,此时location.href的值为

      http://localhost:8083/preview/detail/

      此时注意path属性值前面一定要加/, 不然就会匹配不到对应的页面

      "pages/DemoDetail": {
         "component": "index",
         "path": "detail"
       }
      

      此时当当url为’detail’或’/detail’时会报错 404

      http://localhost:8083/preview/detail is not found

问题

问题1-IDE打开是英文

第一次打开时显示为英文是因为配置还没有加载好,关闭之后重新打开显示的就是中文了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机房运维6大隐患,你中了几个?

随着医院的看诊预约、缴费、打印报告等众多业务转至线上进行&#xff0c;对医院的网络及数据处理能力提出越来越高的要求&#xff0c;那么&#xff0c;机房的稳定、安全运行是医院网络信息系统的关键因素。 机房运维6大隐患 01.电源电力系统不稳定&#xff0c;网络设备运转遭到…

华为面试题就这?00后卷王直接拿下30k华为offer......

先说一下我的情况&#xff0c;某211本计算机&#xff0c;之前在深圳那边做了大约半年多少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发现有点难&#xff0c;这边可能是业绩难做&#xff0c;虚假承诺很厉害&#xff0c;要给那些家长虚假承诺去骗人家&am…

红日(vulnstack)1 内网渗透ATTCK实战

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;sx22 攻击机系统&#xff1a;kali linux 2022.03 网络配置&#xff1a; win7配置&#xff1a; kali配置&#xff1a; kali 192.168.1.108 192.168.111.129 桥接一块&#xff0c;自定义网卡4 win7 1…

一文读懂云渲染“串流”全链路时延及优化策略

​这是一个让云游戏完美起步的时代。 云游戏作为产业内近年来炙手可热的话题&#xff0c;具有“云端运行、超高清、零延时、即点即玩”等众多特性。 随着 5G 时代的到来&#xff0c;以及中心云能力下沉至边缘云&#xff0c;高带宽、低延迟、高性能这些特性与云游戏紧密结合&a…

FastDDS-2.库概览

2. 库概览 Fast DDS&#xff08;前身为Fast RTPS&#xff09;是DDS规范的高效高性能实现&#xff0c;DDS规范是一种用于分布式应用软件的以数据为中心的通信中间件&#xff08;DCPS&#xff09;。本节回顾Fast DDS的体系结构、操作和关键特性。 2.1 架构 Fast DDS的架构如下图…

07_MySQL的单行函数

1. 函数的理解1.1 什么是函数函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既提高了代码效率 &#xff0c;又提高了可维护性 。在 SQL 中我们也可以使用函数对检索…

python之wheel 包命名规则、abi 兼容和安装

一、windows安装python包&#xff0c;遇见的问题 1、python3以后的版本&#xff0c;安装python包&#xff0c;可以直接使用pip安装&#xff0c;但是安装时偶尔报错 2、安装python源码包&#xff0c;如何确定自己该安装哪个版本&#xff0c;一看就晕倒~~~&#xff08;没人扶&…

PMP新考纲考试难不难,通过率怎样?

PMP考试难不难&#xff0c;还是因人而异的&#xff0c;对小白而言&#xff0c;肯定是难的&#xff0c;对项目管理老人而言&#xff0c;难度肯定是没那么高。 据考过的朋友讲&#xff0c;新考纲是有点难度的&#xff0c;尤其是最开始6月25日的考试&#xff0c;2023年就简单些了…

职场性别报告,男女薪酬仍有差距,男性平均薪酬比女性高29.7%

性别是否影响职业&#xff1f;女性求职比男性更加困难&#xff1f;男性薪酬比女性更有优势&#xff1f;人们一说到警察、建筑师通常会想到高大魁梧的男性形象&#xff0c;一说到幼师、护士往往想到的都是温柔的女性形象&#xff0c;职业好似与性别挂钩&#xff1b;女性求职通常…

OnlyOffice验证(二)在Centos7上部署OnlyOffice编译结果

在Centos7上部署OnlyOffice编译结果 此处将尝试将OnlyOffice验证&#xff08;一&#xff09;DocumentServer编译验证的结果部署到Centos7上。并且使用其它服务器现有的RabbitMq和Mysql。 安装Nginx 先安装Nginx需要的依赖环境&#xff1a; yum install openssl* -y yum insta…

java本地搭建宝塔部署实战likeadmin后台管理系统源码 - server端(一)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 上次分享了那几期likeadmin的搭建视频教程&#xff0c;由于是php开发的&#xff0c;这对有些习惯用java开发的同学不太友好&#xff0c;好在这套系统也有java版本的&#xff0c;也有朋友让我录制java版的搭建教程…

1. 驱动开发--基础知识

文章目录1 驱动的概念2 linux体系架构3 模块化设计3.1 微内核和宏内核4 linux设备驱动分类4.1 驱动分类4.2 三类驱动程序详细对比分析4.3 为什么字符设备驱动最重要5 驱动程序的安全性要求5.1 驱动是内核的一部分5.2 驱动对内核的影响5.3 常见驱动安全性问题6 驱动应该这么学6.…

「TCG 规范解读」词汇表

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

66岁“硅仙人与23岁“硅神童”创业晶圆厂,年薪17万美元

美国小伙打造出家庭芯片工厂&#xff01; 溅射、氧化、光刻、蚀刻、绑定、封装全包括&#xff01; 主人公Sam Zeloof&#xff0c;当时是一名大四学生。Sam Zeloof 是 YouTube和 Twitter 上的网络红人。多年来&#xff0c;他一直在记录自己在车库中制造硅芯片的令人印象深刻的…

BI的作用,体现在企业的哪些方面

对市场异常敏感的商业世界自然不会放过获取数字经济的机会&#xff0c;以国企和央企为首的众多企业开始进行数字化转型&#xff0c;通过信息化建设&#xff0c;部署商业智能BI来完成转型工作。 为什么会出现BI 有一点可能出乎很多人意料&#xff0c;虽然 BI 是因为信息化、数…

【项目实战】从0开始入门JDK源码 - ArrayList源码

一、源码位置 一般来说IDEA配置好JDK以后 ,JDK的源码其实也配置好了,本文是基于JDK1.8的源码说明 rt - java - util - ArrayList 二、 继承关系图 ArrayList是实现了 List接口的 public class ArrayList<E> extends AbstractList<E> implements

消息中间件的概念

中间件(middleware)是基础软件的一大类&#xff0c;属于可复用的软件范畴。中间件在操作系统软件&#xff0c;网络和数据库之上&#xff0c;应用软件之下&#xff0c;总的作用是为处于自己上层的应用软件提供运行于开发的环境&#xff0c;帮助用户灵活、高效的开发和集成复杂的…

Word控件Spire.Doc 【书签】教程(1):在C#/VB.NET:在 Word 中插入书签

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

用友YoSuite以高效增长的力量,助力春耕按下生产“快进键”

当下&#xff0c;ChatGPT和元宇宙是当前最热门的科技领域话题&#xff0c;这些高科技领域的发展让我们看到了人工智能与现实的无限可能。民以食为天&#xff0c;农业是国之根本&#xff0c;农业也是关系到每个人生活的重要领域。春耕备耕正当时&#xff0c;让我们拉回视野&…

FlinkCEP(1):复杂事件处理引擎介绍

(1)简介及应用场景: 复杂事件处理(CEP)既是把不同的数据看做不同的事件,并且通过分析事件之间的关系建立起一套事件关系序列库。利用过滤,聚合,关联性,依赖,层次等技术,最终实现由简单关系产生高级事件关系。 复杂事件主要应用场景:主要用于信用卡欺诈检测、用户风险…