微信小程序框架: Taro

做微信小程序的框架, 几个比较主流的:

前两者都是Vue风格的, Taro是React的.

本篇本着学习的目的, 用Taro做一个简单的小程序.

代码在这里: https://github.com/mengdd/mini-program-todo

这是预览图:

本文地址: https://www.cnblogs.com/mengdd/p/mini-program-todo-using-taro.html

背景:

一直做Android开发, 最近想把其他各种技术都撸一撸, 拓展一下视野.

之前练过微信小程序原生开发的例子, 基本上只知道个大概, 翻书马冬梅, 合书马什么梅?

所以这次用框架了, 觉得还是要有个输出, 这样印象深刻一些.

所以本文是从一个小白的角度, 手把手做练习的.

Taro程序环境

这部分参考:

要有node环境, 推荐用nvm来管理.

需要安装CLI工具:

npm install -g @tarojs/cli

创建项目并运行

创建项目

创建模板项目:

taro init myApp

在这个阶段会有一些问题要回答.

* 请输入项目介绍! My awesome project blablabla.
* 是否需要使用 TypeScript ? Yes
* 请选择 CSS 预处理器(Sass/Less/Stylus) Sass
* 请选择模板 默认模板

完了之后会自动安装依赖:

npm install

然后就成功啦!

运行

Taro需要运行不同的命令, 将Taro代码编译成不同端的代码, 然后在对应的开发工具中查看效果.

这里仅说微信小程序. 还是需要微信开发者工具:

https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

import这个项目就行了.

开发前微信开发者工具的项目设置要注意:

需要设置关闭ES6转ES5功能, 开启可能报错.
需要设置关闭上传代码时样式自动补全, 开启可能报错.
需要设置关闭代码压缩上传, 开启可能报错.

这些默认都是关闭的.

微信小程序的编译预览及打包:

npm script

$ npm run dev:weapp
$ npm run build:weapp

或者:

$ taro build --type weapp --watch
$ taro build --type weapp

加上--watch会监听文件修改, 去掉会对代码进行压缩打包.

运行编译命令之后就可以在微信开发者工具中预览了. 是显示一个Hello World.

项目结构

因为创建项目的时候用了TypeScript, 所以项目结构是这样的:

├── dist                   编译结果目录
├── config 配置目录
| ├── dev.js 开发时配置
| ├── index.js 默认配置
| └── prod.js 打包时配置
├── src 源码目录
| ├── pages 页面文件目录
| | ├── index index页面目录
| | | ├── index.scss index页面样式
| | | └── index.tsx index页面逻辑
| ├── app.scss 项目总通用样式
| ├── app.tsx 项目入口文件
| └── index.html
└── package.json

如果需要创建组件, 可以在src下创建component目录来统一存放组件.

"Hello world!"就在index.tsx中.

IDE

关于IDE:

我发现用微信开发者工具是打不开这些后缀名为scsstsx的文件的.

微信开发者工具只能用来预览.

后来用了Intellij, 是能查看文件了,

但是开始写代码之后, 发现没有自动提示, 也没有自动格式化工具.

又下了个VS CODE:

brew cask install visual-studio-code

格式化的快捷键是:

Shift + Alt + F.

后来我在Text Editor设置里勾选了Format On Save.

编写代码

Step 1: 静态页面显示

先弄几个数据静态显示一下:

export default class Index extends Component {
config: Config = {
navigationBarTitleText: '首页'
} constructor(props) {
super(props)
this.state = {
list: ['get up', 'eat breakfast', 'study',]
}
inputVal: ''
} render() {
let { list, inputVal } = this.state return (
<View className='index'>
<View className='list_wrap'>
<Text>Todo List</Text>
{
list.map((item, index) => {
return <View>
<Text>{index + 1}.{item}</Text>
</View>
})
}
</View>
</View>
)
}
}

然后命令行运行:

taro build --type weapp --watch

就会直接显示出来结果. 之后的修改也是随时呈现.

这里IDE报告两个TypeScript的问题:

Property 'list' does not exist on type 'Readonly<{}>'

和:

Property 'inputVal' does not exist on type 'Index'.

按照这里的方法修改的:

interface MyProps {
} interface MyState {
list: Array<string>;
inputVal: string;
} export default class Index extends Component<MyProps, MyState> {
//...
}

代码中设置值的时候调用this.setState().

Step 2: 添加和删除项目

加上输入框, 添加和删除按钮的对应方法.

完整代码:

interface MyProps {
} interface MyState {
list: Array<string>;
inputVal: string;
} export default class Index extends Component<MyProps, MyState> {
config: Config = {
navigationBarTitleText: '首页'
} constructor(props) {
super(props)
this.state = {
list: ['get up', 'eat breakfast', 'study',],
inputVal: ''
} } addItem() {
let { list } = this.state
const inputVal = this.state.inputVal if (inputVal == '') return
else {
list.push(inputVal)
}
this.setState({
list,
inputVal: ''
})
} removeItem(index) {
let { list } = this.state
list.splice(index, 1)
this.setState({
list
})
} inputHandler(e) {
this.setState({ inputVal: e.target.value })
} render() {
let { list, inputVal } = this.state return (
<View className='index'>
<Input className='input' type='text' value={inputVal} onInput={this.inputHandler.bind(this)} />
<Text className='add' onClick={this.addItem.bind(this)}>添加</Text>
<View className='list_wrap'>
<Text>Todo List</Text>
{
list.map((item, index) => {
return <View className='list_item'>
<Text>{index + 1}.{item}</Text>
<Text className='del' onClick={this.removeItem.bind(this, index)}>删除</Text>
</View>
})
}
</View>
</View>
)
}
}

Step 3: 样式调整

用了这里面的样式: https://juejin.im/book/5b73a131f265da28065fb1cd

然后企图调整button的对齐. (CSS不太擅长, 请轻拍, 请指教.)

.input {
display: inline-block;
margin: 32px;
border: 1px solid #666;
width: 65%;
vertical-align: middle;
}
.list_wrap {
padding: 32px;
}
.list_item {
margin: 20px 0;
}
.add,
.del {
display: inline-block;
width: 120px;
height: 60px;
margin: 0 10px;
padding: 0 10px;
font-size: 22px;
line-height: 60px;
text-align: center;
border-radius: 10px;
box-sizing: border-box;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
justify-content: center;
vertical-align: middle;
}
.add {
background-color: #5c89e4;
color: #fff;
border: 1px solid #5c89e4;
}
.del {
background-color: #fff;
color: #5c89e4;
border: 1px solid #5c89e4;
position: absolute;
right: 32px;
}

Taro命令

快速生成新的页面文件:

Taro create --name [页面名称]

参考

最后, 欢迎关注微信公众号: 圣骑士Wind

用Taro做个微信小程序Todo, 小白工作记录的更多相关文章

  1. 用Taro写一个微信小程序(一)——开始一个项目

    一.Taro简介 1.名字由来 Taro['tɑ:roʊ],泰罗·奥特曼,宇宙警备队总教官,实力最强的奥特曼. 2.taro是什么 Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vu ...

  2. mpvue微信小程序项目踩坑记录

    1.mpvue入门教程, http://mpvue.com/mpvue/quickstart.html # . 先检查下 Node.js 是否安装成功 $ node -v v8.9.0 $ npm - ...

  3. 微信小程序开发 --- 小白之路 --- 心得

    1.前言 今天 ,发现我的饭卡不见了....悲催 ,看了一下学校的微信小程序,查了下我这饭卡的流水记录,嗯...最后出现的地方在洗澡房... 好吧,扯远了,虽然没找到,可是突发奇想 ,小程序挺方便的, ...

  4. 小北微信小程序之小白教程系列之 -- 样式(WXSS)

    为了适应广大的前端开发者,WXSS 具有 CSS 大部分 特性.同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改.与 CSS 相比,WXSS 扩展的特性有:尺寸单位和样式导入. ...

  5. 基于Taro.js和微信小程序云开发的移动端校园平台——《我的衡师》

    我学校教务处目前仅有电脑端,并不适配移动端,电脑端也只能使用IE6浏览器访问,兼容性差.我在没有api接口的情况下,通过Carles和Postman抓包,用node.js爬虫实现了后台和小程序的对接. ...

  6. [转]微信小程序开发踩坑记录

    本文转自:http://www.cnblogs.com/NKnife/p/6283605.html 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app. ...

  7. 微信小程序开发踩坑记录

    1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ajax:function() ...

  8. 微信小程序获取用户手机号 记录 (PHP)

    1. 用户登录时需要获取 openid ,同时可以获取 session_key, 二者同时返回, 此时我们要将二者存储在服务端. 2. 小程序端 button 按钮拉起授权, 向api 传递 iv 和 ...

  9. 用Taro写一个微信小程序(二)——配置目录别名

    配置别名可以方便书写代码引用路径,让代码更整洁. 官方文档可参考https://nervjs.github.io/taro/docs/config-detail#alias 一.在config/ind ...

随机推荐

  1. Cobait Strike的socks与ew代理使用

    cobait strike介绍 Cobalt Strike 一款以 metasploit 为基础的 GUI 的框架式渗透测试工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe  ...

  2. [转载] 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  3. OpenCV-Python 理解特征 | 三十六

    目标 在本章中,我们将尝试理解什么是特征,为什么拐角重要等等 解释 你们大多数人都会玩拼图游戏.你会得到很多小图像,需要正确组装它们以形成大的真实图像.问题是,你怎么做?将相同的理论投影到计算机程序上 ...

  4. 十分钟一起学会ResNet残差网络

    作者 | 荔枝boy 目录 深层次网络训练瓶颈:梯度消失,网络退化 ResNet简介 ResNet解决深度网络瓶颈的魔力 ResNet使用的小技巧 总结 深层次网络训练瓶颈:梯度消失,网络退化 深度卷 ...

  5. 模块 time datetime 时间获取和处理

    模块_time 和时间有关系的我们就要用到时间模块.在使用模块之前,应该首先导入这个模块. 1 延时 time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2 获取当前时间戳tim ...

  6. qt creator源码全方面分析(3-6)

    目录 qtcreatorplugin.pri 使用实例 上半部 下半部 结果 qtcreatorplugin.pri 上一节我们介绍了qtcreatorlibrary.pri,现在我们介绍qtcrea ...

  7. 相见恨晚的 Git 命令动画演示,一看就懂!

    虽然 Git 是一个强大的工具,但是我觉得大部分人都会同意我说的:它也可以是一个--噩梦!我一直觉得,使用 Git 的时候把操作过程在脑海里视觉化会非常有用:当我执行某个命令的时候,分支之间是如何交互 ...

  8. 解决浏览器看不到Flash文档(尤其某慕课)

    最近遇到很多朋友说浏览器看不到网课资源的文档等等,就顺手写一篇说一下情况 为什么会文档空白 某课网站上面的文档是用flash进行展示的,同时flash被很多浏览器逐步抛弃(快凉了,都是H5了) fla ...

  9. Zabbix监控平台

                                                                     Zabbix监控平台 案例1:常用系统监控命令 案例2:部署Zabbi ...

  10. Golang笔记集

    学习Golang了, 下面分享我的, 还有我收集的Golang的学习资料 我的基础笔记地址: https://github.com/zhuchangwu/go-study-notes 其他参考: Go ...