Taro框架

Taro与React的本质区别:

React中:一切皆组件
Taro中:小程序端区分页面与组件。配上页面路由的是页面,页面中被引用的自定义组件是组件

一、安装及使用:

参照官方文档 https://nervjs.github.io/taro/docs/GETTING-STARTED.html
视频学习 https://www.imooc.com/learn/1084

安装:
npm install -g @tarojs/cli
使用:
  1. 初始化系项目 taro init myApp

项目构建配置:



  1. Taro可以在多个环境下dev项目


  2. 项目结构:


  • package.json 是依赖包
  • package.config.json 是给微信小程序单独提供的
  • config 是项目启动编译的配置文件的目录
  • dist 是编译好的目录
  • src 是原代码
    src目录下:
    1). index.html是为h5准备的
    2). app.js 即是小程序的入口,又是为h5做路由编译的路由文件(react本身是不需要配置路由的,但是需要在app.js里面配置页面地址)
    3). 在pages/index/index.js下编写纯h5标签也可以生效。但是在小程序中不适用。如果只做h5端可以把taro当成react用。如果适配多端,必须按照taro规范写代码

  1. 更改视图:Taro的数据更新,一定是异步的
    写法1:数据直接写成一个对象
    写法2:数据写在componentDidMount中用this.setState({})设置
import Taro, { Component } from '@tarojs/taro'
import { View, Text, Button } from '@tarojs/components'
import './index.less'

export default class Index extends Component {

  config = {
    navigationBarTitleText: '首页'
  }
  // 更改视图:数据写法1
  state = {
    name: 'Lida'
  }

  componentWillMount () { }

  componentDidMount () { 
    // 更改视图:数据写法2
    // this.setState({name: 'Lida'})
  }

  componentWillUnmount () { }

  componentDidShow () { }

  componentDidHide () { }

  click () {
    this.setState({name: 'Nazi'});
  }
 
  render () {
    return (
      <View className='index'>
        <Text>Hello world!</Text>
        <Text class="name">{this.state.name}</Text>
        <Button onClick={this.click}>Change_name</Button>
      </View>
    )
  }
}

同步更新数据写法:
更新数据之后,执行回调



  1. props 由父组件传给子组件的属性:
    props是只读属性,想要修改必须在父组件通过事件修改
    1). 首先定义子组件
import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'

// 定义class,继承Component
class Child extends Component {
    // render函数是必须实现的
    render () {
        return (
            <View>
                <Text>{this.props.name}</Text>
            </View>
        )
    }
}

// 给子组件一个默认值
Child.defaultProps = {
    name: ''
}
export default Child;

2). 在父组件中引入

import Child from './child'

<Child name="Child-Grey"></Child> 

给子组件<Child></Child>传一个name属性
3). 修改props



子组件:

import Taro, { Component } from '@tarojs/taro'
import { View, Text, Button } from '@tarojs/components'
// import './index.less'

// 定义class,继承Component
class Child extends Component {
    clickHandler () {
        this.props.onchange();
    }

    // render函数是必须实现的
    render () {
        return (
            <View>
                <Text>{this.props.name}</Text>
                <Button onClick={this.clickHandler}>调用上层事件</Button>
            </View>
        )
    }
}

// 给子组件一个默认值
Child.defaultProps = {
    name: ''
}
export default Child;

父组件:

  change () {
    this.setState({name: '改变name值,起个中文名'})
  }

<Child name={this.state.name} onchange={this.change.bind(this)}></Child>
  1. Taro提供的UI框架——Taro UI
    cnpm install taro-ui@1.5.0 -D
    最新版本有bug,组件不能正常使用,文档未说明。
    npm安装这个框架会停滞
    官方文档 https://taro-ui.aotu.io/#/docs/introduction

注意事项:

  1. PX要大写,如果不大写会被转换成rem

二、其他(个人学习用)

值得记忆:

  1. 解构 赋值写法let {activity: [firstItem]} = this.state;
  2. Class类的概念Activity
class Activity extends Component {
    constructor () {
        // super() 作为函数调用。继承父函数以后必须要执行super(),super的this指向子函数Activity
        super(...arguments);
        this.state = {
            activity: [
                {
                    type: "cut",
                    info: [
                        {total: 48, cut: 10},
                        {total: 58, cut: 20},
                        {total: 100, cut: 30}
                    ]
                }
            ]
        }
    }
    render () {
        // 相当于取this.state中的activity中的数组中的第一个元素,命名为firstItem
        let {activity: [firstItem]} = this.state;

        return (
            <View className="activity">
                <Text className="type">{this.getTextByType(firstItem.type)}</Text>
                <Text>{this.getLine(firstItem.info)}</Text>
                <Text className="length">{this.state.activity.length}个活动</Text>
            </View>
        )
    }
}

  1. react中写法:
// cata.js
import Taro, { Component } from '@tarojs/taro'
import { View, Text, Image } from '@tarojs/components'
import './cata.less'

class Cata extends Component {
    constructor () {
        super(...arguments);
        this.state = {
            selectCata: null,  // 选中的分类
            cata: [
                {id: 1, name: '专场'},
                {id: 2, name: '热销'},
                {id: 3, name: '折扣'},
                {id: 4, name: '汉堡'},
                {id: 5, name: '炸鸡'},
                {id: 6, name: '饮品'}
            ]
        }
    }

    handlerClick (item) {
        if (this.state.selectCata && this.state.selectCata.id != item.id) {
            this.setState({ selectCata: item });
            console.log(this.state);
        } else if (!this.state.selectCata) {
            this.setState({ selectCata: item });
        }
    }

    render () {
        let {cata, selectCata} = this.state;

        return (
            <View className="cata">
                {/* 
                    1. .map()循环<Text></Text>
                    2. 把每一项的id传给key -> key={item.id}
                    3. 绑定class -> 如果selectCata存在 同时 selectCata.id == item.id,就添加class="select"
                    4. 对每一项添加点击事件 -> 将每一项的item传给回调函数
                    5. 回调函数内部逻辑:如果selectCata存在 同时 selectCata.id != item.id,就将当前项的item 传给 selectCata; 如果selectCata不存在就直接赋值。
                */}
                {
                    cata.map((item, index) => {
                        return <Text onclick={this.handlerClick.bind(this, item)} className={"cata-name " + ((selectCata && selectCata.id == item.id) ? 'select' : null)} key={item.id}>{item.name}</Text>
                    })
                }
            </View>
        )
    }
}

export default Cata;
  1. 兄弟组件间数据传递解决方案:
    1). 通过上级(父)的View组件


2). 通过事件监听,在组件1定义事件,在组件2监听事件执行事件函数
3). Redux

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容