目录
前言:本来是准备好好准备考研的……结果WWDC大赛又给我整这一出,本来是打算直接使用Swift语言的……结果看着SwiftUI和MacPro我不知所措,本来是想开发一个小程序记录一下摘抄的文学名句的,结果莫名其妙看到uni-app打包成iOS APP……阴差阳错,那就学吧。
环境搭建:
HBuilderX编辑器相关资料
page.json:全局配置,指定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar等
manifest.json:应用配置文件,指定应用的名称、图标、权限等
App.vue:根组件,所有页面都是在该文件下进行切换的,是页面入口文件,可以调用应用的生命周期函数
main.js:项目入口文件,初始化
uni.scss:控制应用风格
unpackage:打包目录
pages:所有的页面存放目录
static:静态资源目录
components:组件存放目录
为兼容多端运行,建议使用
flex进行开发。
优点
缺点
全局配置
page.json进行配置,相关属性可参考uni-app全局文件
| 属性 | 类型 | 必填 | 描述 | 平台兼容 |
|---|---|---|---|---|
| globalStyle | Object | 否 | 设置默认页面的窗口表现 | |
| pages | Object Array | 是 | 设置页面路径及窗口表现 | |
| easycom | Object | 否 | 组件自动引入规则 2.5.5+ | |
| tabBar | Object | 否 | 设置底部 tab 的表现 | |
| condition | Object | 否 | 启动模式配置 | |
| subPackages | Object Array | 否 | 分包加载配置 | |
| preloadRule | Object | 否 | 分包预下载规则 | 微信小程序 |
| workers(opens new window) String | 否 | Worker 代码放置的目录 | 微信小程序 | |
| leftWindow Object | 否 | 大屏左侧窗口 | H5 | |
| topWindow Object | 否 | 大屏顶部窗口 | H5 | |
| rightWindow Object | 否 | 大屏右侧窗口 | H5 |
页面配置
所有的页面应当放在
pages目录
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path" : "pages/message/message"
},
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
}
}
],
}
tabbar
{
"tabBar": {
"list": [
{
"text": "",
"pagePath": "./pages/message/message",
"iconPath": "./static/logo.png"
},
],
}
}
condition启动模式配置
启动模式配置,仅仅开发期间生效,用于模拟直达的场景。
属性说明
| 属性 | 描述 |
|---|---|
| current | 当前激活的模式,list节点的索引值 |
| list | 启动模式列表 |
list说明
| 属性 | 描述 |
|---|---|
| name | 启动模式名称 |
| path | 启动页面路径 |
| query | 启动参数,可在页面的onLoad函数里获得 |
text文本组件
view视图容器
button按钮组件
image组件
rpx即响应式px,一种根据屏幕宽度自适应的动态单位。@import语句可以导入外联样式表class、id、element等uni-app中不能使用*page相当于bodyApp.vue中的样式为全局样式,作用于每一一个页面。 在pages目录下的vue文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖App.vue中相同的选择器。 uni -app支持使用字体图标,使用方式与普通web项目相同字体文件的引用路径推荐使用~@开头的绝对路径
在页面中需要定义数据,和vue一样,直接在data中定义数据即可。
<script>
export default {
data() {
return {
msg: "hello uni-app",
img: "http://...png"
}
},
methods: {
demo() {
console.log("hello uni")
}
}
}
</script>
插值表达式的使用
<view>{{msg}}</view>
v-bind动态绑定属性
<image v-bind:src="img"> </image>
注册事件
<button v-on:click="demo">push me</button>
传递参数
默认是传递
event参数,即e
methods: {
demo(e) {
console.log("hello uni" + e)
}
}
应用的生命周期
| 函数名 | 说明 |
|---|---|
| onLaunch | 初始化完成触发 |
| onShow | 启动 |
| onHide | 从前台进入后台 |
| onError | 报错时 |
页面的生命周期
| 函数名 | 说明 |
|---|---|
| onLoad | 监听页面加载,其参数为上个页面传递的参数,参数类型为Object |
| onShow | 监听页面显示,页面每次出现在屏幕上触发 |
| onReady | 监听页面初次渲染时完成 |
| onHide | 监听页面加载 |
组件的生命周期
其他可见官网,在此不做过多叙述
POST请求
uni.request({
url: 'https://www.example.com/request',
data: {
text: 'uni.request'
},
success: (res) => {
console.log(res.data);
this.text = 'request success';
}
});
uni.setStorage(OBJECT):将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。
uni.setStorage({
key: 'storage_key',
data: 'hello',
success: function () {
console.log('success');
}
});
uni.setStorageSync(KEY,DATA):将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
try {
uni.setStorageSync('storage_key', 'hello');
} catch (e) {
// error
}
uni.getStorage(OBJECT):从本地缓存中异步获取指定 key 对应的内容。
uni.getStorage({
key: 'storage_key',
success: function (res) {
console.log(res.data);
}
});
uni.removeStorage(OBJECT):从本地缓存中异步移除指定 key。
uni.removeStorage({
key: 'storage_key',
success: function (res) {
console.log('success');
}
});
条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台
写法:以#ifdef加平台标识开头,以#endif结尾。
在不同的文件中均可以使用注释跨端兼容
<!--#ifdef H5 -->
<!--#endif -->
| 值 | 生效条件 |
|---|---|
| MP-WEIXIN | 微信小程序 |
| APP-PLUS | APP |
| MP | 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/飞书小程序/QQ小程序/360小程序 |
利用navigator进行跳转
<navigator url="">
<button>push me</button>
</navigator>
编程式跳转
<button v-bind:click="push">
push me
</button>
<script>
push() {
uni.navigator() {
url: ""
}
}
</script>
通过switchTab跳转到tabbar页面
<button v-bind:click="push">
push me
</button>
<script>
push() {
uni.switchTab() {
url: ""
}
}
</script>
组件作为Vue中的一个重要的组成部分,其重要性不言而喻
在uni-app中,可以通过创建一个 后缀名为vue的文件,即创建一个组件成功, 其他组件可以将该组件通过import的方式导入,在通过components进行注册即可
components是一个自定义创建目录,使其更加符合工程规范。
<template>
<test><test>
</template>
<script>
import "test.vue"
components: {
testa: test
}
</script>
父组件给子组件传值
通过props来接受外界传递到组件内部的值
</template>
<view> {{msg}} </view>
<template>
<script>
export default {
props: ['msg']
}
</script>
传递者
<template>
<test :msg="msg"> </test>
</template>
<script>
import "...test.vue"
export default {
data() {
return {
msg: "hello uni-app"
}
},
components: {
testa: test
}
}
</script>
子组件给父组件传参
通过$emit触发事件进行传递参数
传递参数
<template>
<button @click="my"> </button>
</template>
<script>
...
methods: {
my() {
$emit("do", this.status)
}
}
...
</script>
接收参数
<template>
<test @do="po"> </test>
</template>
<script>
...
methods: {
po(param) {
console.log(param)
}
}
...
</script>
兄弟组件传参
uni.$emit(eventName, OBJECT):触发全局的自定义事件,附加参数都会传给监听器回调
uni.$on(eventName, callback):监听全局的自定义事件,事件可以由uni.$emit触发,回调函数会接收所有传入事件触发函数的额外参数
<script>
created() { <!-- 组件的生命周期 -->
<!-- 注册全局事件 -->
uni.$on("updateNum", num => {
this.num += num
})
}
</script>
uni-ui是DCloud提供的一个跨端ui库,它是基于vue组件的、flex布局的、无dom的跨全端ui框架。
uni-ui特点
各取所需,各取所得!
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho