用Taro做个微信小程序Todo, 小白工作记录
微信小程序框架: Taro
做微信小程序的框架, 几个比较主流的:
- 官方的
WePY: https://tencent.github.io/wepy/document.html#/ - 美团的
mpvue: http://mpvue.com/mpvue/#-html - 京东的
Taro: https://taro.aotu.io/ 
前两者都是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程序环境
这部分参考:
- 官方文档: https://nervjs.github.io/taro/docs/README.html
 - Getting Started:
https://nervjs.github.io/taro/docs/GETTING-STARTED.html 
要有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:
我发现用微信开发者工具是打不开这些后缀名为scss和tsx的文件的.
微信开发者工具只能用来预览.
后来用了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, 小白工作记录的更多相关文章
- 用Taro写一个微信小程序(一)——开始一个项目
		
一.Taro简介 1.名字由来 Taro['tɑ:roʊ],泰罗·奥特曼,宇宙警备队总教官,实力最强的奥特曼. 2.taro是什么 Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vu ...
 - mpvue微信小程序项目踩坑记录
		
1.mpvue入门教程, http://mpvue.com/mpvue/quickstart.html # . 先检查下 Node.js 是否安装成功 $ node -v v8.9.0 $ npm - ...
 - 微信小程序开发  --- 小白之路  --- 心得
		
1.前言 今天 ,发现我的饭卡不见了....悲催 ,看了一下学校的微信小程序,查了下我这饭卡的流水记录,嗯...最后出现的地方在洗澡房... 好吧,扯远了,虽然没找到,可是突发奇想 ,小程序挺方便的, ...
 - 小北微信小程序之小白教程系列之 -- 样式(WXSS)
		
为了适应广大的前端开发者,WXSS 具有 CSS 大部分 特性.同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改.与 CSS 相比,WXSS 扩展的特性有:尺寸单位和样式导入. ...
 - 基于Taro.js和微信小程序云开发的移动端校园平台——《我的衡师》
		
我学校教务处目前仅有电脑端,并不适配移动端,电脑端也只能使用IE6浏览器访问,兼容性差.我在没有api接口的情况下,通过Carles和Postman抓包,用node.js爬虫实现了后台和小程序的对接. ...
 - [转]微信小程序开发踩坑记录
		
本文转自:http://www.cnblogs.com/NKnife/p/6283605.html 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app. ...
 - 微信小程序开发踩坑记录
		
1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ajax:function() ...
 - 微信小程序获取用户手机号 记录 (PHP)
		
1. 用户登录时需要获取 openid ,同时可以获取 session_key, 二者同时返回, 此时我们要将二者存储在服务端. 2. 小程序端 button 按钮拉起授权, 向api 传递 iv 和 ...
 - 用Taro写一个微信小程序(二)——配置目录别名
		
配置别名可以方便书写代码引用路径,让代码更整洁. 官方文档可参考https://nervjs.github.io/taro/docs/config-detail#alias 一.在config/ind ...
 
随机推荐
- 发布内容需要的Markdown语法
			
发布内容需要的Markdown语法 目录 发布内容需要的Markdown语法 [toc] 1.概述 1.1设计理念 1.2内联HTML语法 1.3特殊字符自动转义 2.行内语法讲解 2.1注释的表述 ...
 - TensorFlow 实战卷积神经网络之 LeNet
			
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! LeNet 项目简介 1994 年深度学习三巨头之一的 Yan L ...
 - ClickHouse学习系列之二【用户权限管理】
			
背景 最近花了些时间看了下ClickHouse文档,发现它在OLAP方面表现很优异,而且相对也比较轻量和简单,所以准备入门了解下该数据库系统.在安装完之后首先做的应该如何设置用户密码以及权限控制.因为 ...
 - SpringCloud服务的注册发现--------zookeeper实现服务与发现 +  Ribbon实现客户端负载均衡
			
1,Eureka 闭源了,但是我们可以通过zookeeper实现注册中心的功能. zookeeper 是一个分布式协调工具,可以实现服务的注册和发现,配置中心,注册中心,消息中间件的功能 2,工具准备 ...
 - nodejs使用express中静态资源托管(express.static())时遇到的bug
			
如下:将test.html的页面挂载在服务器上, const express= require('express') const fs= require('fs') let app = express ...
 - Mysql数据库的基本操作(1)
			
一.启动数据库 1. 我的电脑(此电脑)--->右键点击[管理]--->[服务和应用程序]--->[服务] 找到MySQL8.0可以选择手动启动或者自动启动. 2.可以直接通过命令行 ...
 - Q - Queue HDU - 5493(树状树组维护区间前缀和 + 二分找预留空位)
			
Q - Queue HDU - 5493 Problem Description NNN people numbered from 1 to NNN are waiting in a bank for ...
 - 通过 plsql 连接远程 Oracle
			
方法一:通过 plsql 工具和 oracle client(不是即时客户端 instantclient) 的方式来连接 Oracle 一. 安装 oracle client,(本教程已经下载并解压) ...
 - Java对字母大小写转换
			
Java对字母大小写转换 1.小写——大写String aa = "abc".toUpperCase(); 2.大写——小写 String bb = "ABC" ...
 - mysql 聚集函数 count 使用详解
			
mysql 聚集函数 count 使用详解 本文将探讨以下问题 1.count(*) . count(n).count(null)与count(fieldName) 2.distinct 与 coun ...