Maison  >  Article  >  Applet WeChat  >  Première expérience dans le développement de mini-programmes WeChat

Première expérience dans le développement de mini-programmes WeChat

hzc
hzcavant
2020-06-20 10:18:333434parcourir

Instance de composant

this.selectComponent('.classSelector')

Introduction

<span style="font-size: 14px;">Taro</span>

Vant Weapp est introduit dans Taro et ne peut pas être appelé directement via des packages NPM tiers.

Vous devez effectuer les étapes suivantes :

  • Trouvez le package de fichiers de téléchargement Vant-weapp sur github et copiez le répertoire dist correspondant dans le projet /src/components/vant-weapp répertoire.
  • Dans Pages du fichier correspondant, configurez les composants requis pour chaque page. (Le soi-disant enregistrement global des composants ne peut pas être effectué dans config.usingComponents.) app.js
  config = {
    navigationBarTitleText: '首页',
    usingComponents: {
      "van-button": "../../components/vant-weapp/button/index",
      "van-popup": "../../components/vant-weapp/popup/index"
    }
  }
    Après avoir utilisé le composant
  • , la construction Vant-weapp sera taro automatiquement en conséquence Copiez une copie des composants dans , et les composants de dist/components dépendent également de la bibliothèque d'outils Vant-weapp, et la bibliothèque d'outils /src/components/vant-weapp/wxstaro ne sera pas automatiquement copiée dans . Par conséquent, nous devons modifier le dist dans le fichier /config/index.js afin qu'il soit automatiquement copié dans le répertoire correspondant de config.copy.patterns lors de la compilation. dist
  copy: {
    patterns: [
      {
        from: 'src/components/vant-weapp/wxs/',
        to: 'dist/components/vant-weapp/wxs/'
      }
    ],
    options: {
    }
  },
    L'unité utilisée dans le style de
  • étant Vant-weapp, elle sera compilée en px par taro afin de s'adapter à chaque appareil. Vous pouvez modifier le rpx dans le fichier /config/index.js pour empêcher la conversion d'unité. config.weapp.module.pxtransform.selectorBlackList
pxtransform: {
  enable: true,
  config: {

  },
  selectorBlackList: [
    /^.van-.*?$/,  // 这里是vant-weapp中className的匹配模式
  ]
},

ec-canvas

est la version applet WeChat de ec-canvas. ECharts

iconfont

Téléchargez-le localement, ne changez rien, placez-le à l'emplacement spécifié.

Cette ressource ne sera pas automatiquement copiée dans le dossier

, elle doit donc être copiée en modifiant le fichier de configuration. dist/

  copy: {
    patterns: [
      ...
      {
        from: 'src/assets/fonts/',
        to: 'dist/assets/fonts/'
      },
      ...
    ],
    options: {
    }
  }
Puis, dans le

fichier d'entrée, app.js. import './assets/fonts/iconfont.css'

Composant personnalisé

Composant transmettant des paramètres
this.triggerEvent(
  'eventType',
  {
    key: value, //这里定义的键值对,在父组件中,通过args.detail.key获取;
  },
  {
    bubbles: true, //事件属性:是否冒泡;
    capturePhase: true, //事件属性: 是否可捕获;
  }
)

Slot

est utilisé de la même manière que
. Vue

Remarque  : Les styles définis dans le composant pour ne fonctionneront pas. Le style de la structure passé en slot ne peut être défini qu'à l'endroit où le composant est appelé. slot

Obstacles au développement

<h3>TabBar personnalisé dans Taro<code><span style="font-size: 14px;">Taro</span>

Quand changer d'onglet (config.tabBar.custom = true dans app.jsx), cela doit être dans le cycle de vie de la page de l'onglet correspondante componentDidShow :

if (typeof this.$scope.getTabBar === 'function' && this.$scope.getTabBar()) {
  this.$scope.getTabBar().setData({
    selected: 1
  })
}

Notez que c'est this.$scope.getTabBar .

Problème de couverture de niveau causé par Canvas

canvas est un composant natif créé par le client, et le niveau du composant natif est le plus élevé, donc la page Peu importe le nombre d'autres composants définis dans z-index, ils ne peuvent pas être placés au-dessus du composant natif.

Donc, si canvas interagit avec le masque en même temps, canvas sera au-dessus du masque.

Solution :

  • enveloppez une couche de structure à l'extérieur de canvas et définissez l'attribut canvas du conteneur hidden via des conditions (commutateur de masque).
  • En personnalisant les composants avec cover-view et cover-image, cover-view peut être positionné et élevé pour éviter d'être écrasé par canvas.

    • Étant donné que le composant natif inséré ultérieurement peut écraser le composant natif précédent, veuillez noter : structurellement, cover-view doit être derrière canvas
    • Vous ; peut ajuster l'ordre d'affichage via flex et order.
    • Seule la couche la plus externe de cover-view prend en charge position: fixed. L'opérateur
    • ne peut pas être utilisé dans l'instruction

typeof

wx:iftypeof, et l'opérateur {{}} ne peut pas être utilisé dans typeof. Ne peut être utilisé qu'au sein de wxs.

affectation d'initialisation des données

Je ne sais pas quand les données seront initialisées, mais lors de l'initialisation de data, vous ne pouvez pas utiliser this pour pointer vers le courant instance du composant (c'est this === void 0), c'est-à-dire que l'data initialisation ne peut donner qu'une seule constante . Lorsque

a besoin de properties ou methods pour initialiser data, la valeur de attached ne peut être mise à jour que via this.setData dans le cycle de vie data.

而且,如果data.fn = this.methodNamemethodName中如果调用了this引用,这时this指向的是data,所以需要使用data.fn = this.methodName.bind(this)

vant-weapp库中的popup样式设置

popup内容的大小不是由内容撑起来的,需要通过popup组件的custom-class定义一个类名,设置widthheight来定义内容的尺寸。

vant-tree-select事件触发

Taro中的代码风格类React,而vant-weapp库中的代码风格为wxmlwxs风格。React绑定事件是驼峰式,wxml绑定事件是使用-连字符分隔。

这就造成了Taro使用vant-tree-select组件时,onClickNavonClickItem不会被vant-tree-select识别,事件无法触发。

解决方案:对vant-tree-select进行二次封装,事件原始触发通过this.$triggerEvent传出驼峰式的事件类型,在Taro中调用。


目前vant-weapp0.5.20中,vant-tree-select不支持单选。

props获取不到

驼峰式命名的事件无法触发[微信小程序]

注意@tarojs/cli版本,如最初用的1.2.0版本就获取不到自定义组件传的参数,升级到最新版1.3.15就可以了。

注意@tarojs/cli版本,如最初用的1.2.0版本无法触发驼峰式命名的事件,升级到最新版1.3.15,使用onClick-nav形式绑定事件就可以了。

<span style="font-size: 14px;">Taro</span>编译器无法自动将用到组件的<span style="font-size: 14px;">.wxs</span>文件移动到<span style="font-size: 14px;">/dist</span>相应目录下

手动移动。

<span style="font-size: 14px;">微信开发者工具</span>中运行<span style="font-size: 14px;">Taro</span>代码,如果有<span style="font-size: 14px;">async/await</span>,则regenerator is not defined。

微信开发者工具--> 右上角详情--> 本地设置里的配置全部关掉,如ES6转ES5...。

定制echarts,引入报错

echarts.js不需要再次编译,配置中新增编译时忽略echarts.js

weapp: {
    ...
    compile: {
      exclude: ['src/echarts-for-weixin/ec-canvas/echarts.js']
    }
}

getState()获取Store存储的数据

可以在<span style="font-size: 14px;">(dispatch, getState) => {</span>中使用。

真机调试正常,预览/体验版空白(只有tabbar)

将"本地设置"--> "上传时进行代码保护"取消勾选。

<span style="font-size: 14px;">Taro</span><span style="font-size: 14px;">className=''</span>单引号赋值不起作用。

className的值使用双引号包裹。

<span style="font-size: 14px;">Taro</span>自定义组件内部使用<span style="font-size: 14px;">iconfont</span>,不显示图标

参照外部样式类、全局样式类。
或者,组件单独引入iconfont.css也可以。

获取路由参数

this.$router.params

<span style="font-size: 14px;">iconfont</span>字符串渲染

如果将字体做变量使用,通用情况下无法正常显示。

  • 需要将icon: ['&#xe61d;', '&#xe62c;']改写成icon: ['\ue61e', '\ue62d']
  • <rich-text nodes={&#xe61e;}></rich-text>

使用Taro/微信小程序同步接口,仍异步返回结果

如使用Taro.getStorageSync('key')获取缓存数据,结果仍是异步返回。同步接口需要结合await使用,才是真正的同步。

分包

包大小限制

  • 包超过2048KB,无法上传

分包操作

  • 主包不需要特殊处理。

    • navigateTab导航的页面必须在主包中。
  • 分包

    • 分包在subPackages配置。
    pages: [
      'pages/login/login',
      'pages/index/index',
      'pages/manage/manage',
      'pages/schedule/schedule',
      'pages/inpidual/inpidual'
    ],
    'subPackages': [
      {
         'root': 'pages-main',
         name: 'main',
          'pages': [
            'acs/acs',
            'acs-setting/acs-setting',
            'setting-details/setting-details',
            'current-energy/current-energy',
            'history-energy/history-energy',
            'electricity/electricity',
            'runtime/runtime',
            'daily-usage/daily-usage',
            'onshift-record/onshift-record',
            'schedule-details/schedule-details'
        ]
      },
    ],

伪动态绑定事件

// index.wxml
<input
    wx:if="{{metas.type == &#39;text&#39; || metas.type == &#39;number&#39; || metas.type == &#39;idcard&#39; || metas.type == &#39;digit&#39;}}"
    name="{{metas.name}}"
    type="{{metas.type}}"
    value="{{value}}"
    placeholder="{{metas.attrs.placeholder}}"
    bindchange="{{changeValidate}}"
    bindinput="{{inputValidate}}"
    bindblur="{{blurValidate}}"
/>
// index.js

Component({
    data: {
        changeValidate: '',
        inputValidate: '',
        blurValidate: '',
        eventType: 'input',
        rules: '',
        value: '',
        isRequired: false,
        validateState: '', //['validating', 'success', 'error']
        validateMessage: ''
    },
    observers: {
        rules(newV) {
            console.log('------=======')
            this.setData({
                [`${this.data.eventType}Validate`]: 'onBlurValidate'
            })
        }
    },
    methods: {
        onBlurValidate (e) {
            this.onValidate(e, rule)
        },
        onValidate (e, rule) {

        }
    }
})

获取组件实例

refFormItem =  (node, idx) => {
    if(this.formItem) {
        !this.formItem.includes(node) &&    this.formItem.push(node)
    } else {
        this.formItem = [node]
    }
}
...
clearValidate  () {
    console.log(this.formItem)
    this.formItem.forEach(item => {
        item.clearValidate()
    })
}
...
render  () {
    const { fieldMetas } = this.props;
    return (
        <Form  className="form"  onSubmit={this.submitForm.bind(this)}>

        {

            fieldMetas.map((meta, idx) => {

                return (
                    <form-item  ref\={this.refFormItem} onValidate={this.gatherValidate.bind(this)} taroKey={meta.name} metas={meta} initialValue={this.findValue.call(this, meta.name)}>
                    </form-item>
                )
            })
        }
            <Button  form-type="submit">按钮</Button>
            <Button  onClick={this.clearValidate}>按钮</Button>
        </Form>
    )
}

styleIsolation:  "apply-shared"

对于options.styleIsolation =  "apply-shared"的应用:
如果是组件包裹组件,内部组件设置该配置,外部组件的样式依旧无法影响内部组件,Page()或Component()注册的页面级的样式才能影响到组件内部样式

推荐教程:《微信小程序

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer