집 >위챗 애플릿 >미니 프로그램 개발 >WeChat 미니 프로그램 개발 첫 경험
this.selectComponent('.classSelector')
this.selectComponent('.classSelector')
Taro中引入Vant Weapp,不能直接通过第三方NPM
包的形式直接调用。
需要进行以下几步:
dist
目录复制到项目/src/components/vant-weapp
目录下。Pages
对应文件的config.usingComponents
中,配置每个页面所需要的组件。(无法在app.js
中进行所谓的全局注册组件。)config = { navigationBarTitleText: '首页', usingComponents: { "van-button": "../../components/vant-weapp/button/index", "van-popup": "../../components/vant-weapp/popup/index" } }
Vant-weapp
组件后,taro
构建会自动将相应的组件复制一份到dist/components
下,而Vant-weapp
的组件还依赖工具库/src/components/vant-weapp/wxs
,该工具库taro
不会自动复制到dist
中。所以,我们需要修改/config/index.js
文件中的config.copy.patterns
,让其在编译时,自动复制到dist
对应目录下。copy: { patterns: [ { from: 'src/components/vant-weapp/wxs/', to: 'dist/components/vant-weapp/wxs/' } ], options: { } },
Vant-weapp
的样式使用的单位是px
,所以会被taro
编译成rpx
,以便对各个设配进行适配。可以通过修改/config/index.js
文件中的config.weapp.module.pxtransform.selectorBlackList
不让其单位转换。pxtransform: { enable: true, config: { }, selectorBlackList: [ /^.van-.*?$/, // 这里是vant-weapp中className的匹配模式 ] },
ec-canvas
是ECharts
的微信小程序版本。
下载到本地,什么都不要改,放到指定位置。
该资源不会自动拷贝到dist/
文件夹下,所以需要通过修改配置文件拷贝。
copy: { patterns: [ ... { from: 'src/assets/fonts/', to: 'dist/assets/fonts/' }, ... ], options: { } }
然后,在app.js
入口文件中,import './assets/fonts/iconfont.css'
。
this.triggerEvent( 'eventType', { key: value, //这里定义的键值对,在父组件中,通过args.detail.key获取; }, { bubbles: true, //事件属性:是否冒泡; capturePhase: true, //事件属性: 是否可捕获; } )
用法同Vue
。
注意:组件内部对slot
定义的样式,不起作用。只能在调用组件的位置,对传入slot
内的结构进行样式定义。
<span style="font-size: 14px;">Taro</span>
中自定义tabBar
切换Tab时(app.jsx
中config.tabBar.custom = true),需要在对应Tab页componentDidShow
生命周期中:
if (typeof this.$scope.getTabBar === 'function' && this.$scope.getTabBar()) { this.$scope.getTabBar().setData({ selected: 1 }) }
注意是this.$scope.getTabBar。
canvas
是由客户端创建的原生组件,而原生组件的层级是最高的,所以页面中的其他组件无论设置z-index
为多少,都无法盖在原生组件上。
所以,如果canvas
和遮罩交互同时存在时,canvas
会在遮罩的上层。
解决方案:
canvas
外包裹一层结构,通过条件(遮罩的开关)来设置canvas
容器的hidden
属性。通过cover-view
、cover-image
自定义组件,cover-view
通过定位,提升层级,可以防止被canvas
覆盖。
cover-view
一定要在canvas
后边;flex
和order
来调整展示顺序。cover-view
才支持position: fixed
。typeof
wx:if
语句中,不能使用typeof
运算符,{{}}
中不能使用typeof
运算符,只能在wxs
中使用。
不知道data什么时机初始化,但,初始化data
的时候,不能使用this
指向当前组件实例(这是this === void 0
),也就是说,data
初始化只能给一个常量。
需要properties
或methods
来初始化data
的时候,只能在生命周期attached
中通过this.setData
更新data
NPM
패키지를 통해 직접 호출할 수 없습니다. 🎜🎜🎜다음 단계를 수행해야 합니다: 🎜dist
디렉터리를 프로젝트 /src/comComponents/vant-weapp
디렉토리. 페이지
해당 파일의 config.usingComponents
에서 각 페이지에 필요한 구성요소를 구성합니다. (소위 전역 등록 구성 요소는 app.js
에서는 수행할 수 없습니다.)weapp: { ... compile: { exclude: ['src/echarts-for-weixin/ec-canvas/echarts.js'] } }
Vant-weapp 사용 시 code> 구성 요소 이후에 <code>taro
빌드는 해당 구성 요소를 자동으로 dist/comComponents
및 Vant-weapp
에 복사합니다. >의 구성요소는 또한 taro
가 자동으로 복사되지 않는 도구 라이브러리 /src/comComponents/vant-weapp/wxs
에 의존합니다. 거리. 따라서 /config/index.js
파일의 config.copy.patterns
를 수정하여 dist
에 자동으로 복사할 수 있도록 해야 합니다. 컴파일하는 동안 >해당 디렉터리 아래. 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' ] }, ],
Vant-weapp
스타일은 px
단위를 사용하므로 타로
가 됩니다. code>는 rpx
로 컴파일되어 각 장치에 맞게 조정됩니다. /config/index.js
파일의 config.weapp.module.pxtransform.selectorBlackList
를 수정하여 단위 변환을 방지할 수 있습니다. // index.wxml <input wx:if="{{metas.type == 'text' || metas.type == 'number' || metas.type == 'idcard' || metas.type == 'digit'}}" name="{{metas.name}}" type="{{metas.type}}" value="{{value}}" placeholder="{{metas.attrs.placeholder}}" bindchange="{{changeValidate}}" bindinput="{{inputValidate}}" bindblur="{{blurValidate}}" />
ec-canvas
는ECharts
의 WeChat 애플릿 버전입니다.
dist/
폴더에 자동으로 복사되지 않으므로 구성 파일을 수정하여 복사해야 합니다. 🎜// 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) { } } })🎜그런 다음
app.js
항목 파일에서 './assets/fonts/iconfont.css'
를 가져옵니다. 🎜🎜🎜커스텀 컴포넌트🎜🎜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> ) }
사용법은 Vue
와 동일합니다 >.
🎜참고: 구성 요소 내부의 slot
에 대해 정의된 스타일은 효과가 없습니다. slot
에 전달된 구조체의 스타일은 구성 요소가 호출되는 위치에서만 정의할 수 있습니다. 🎜🎜🎜개발 장애물🎜🎜🎜Taro🎜
🎜 맞춤 tabBar🎜app.jsx
의 config.tabBar.custom = true), 해당 탭 페이지 comComponentDidShow
라이프 사이클에 있어야 합니다. 🎜rrreee🎜 🎜this.$scope.getTabBar라는 점에 유의하세요. 🎜🎜🎜그래서canvas
는 클라이언트가 생성한 네이티브 컴포넌트로, 네이티브 컴포넌트의 레벨이 가장 높기 때문에 페이지z-index
가 아무리 설정되어 있어도 기본 구성 요소에 다른 구성 요소를 배치할 수 없습니다.
캔버스
와 마스크 상호작용이 동시에 존재한다면 캔버스
가 마스크 위에 있게 됩니다. 🎜🎜해결책: 🎜캔버스
외부에 구조 레이어를 래핑하고 조건(마스크 스위치)을 통해 캔버스
컨테이너의 를 숨김으로 설정합니다.
속성. cover-view
및 cover-image
를 통해 구성 요소를 맞춤 설정하고 cover-view
위치 지정을 통해 레벨을 향상시킵니다. 캔버스
로 덮이는 것을 방지할 수 있습니다. 🎜cover-view
는 반드시 캔버스
에 있어야 합니다. ;flex
및 order
를 통해 조정할 수 있습니다. 커버 뷰
만 위치: 고정
을 지원합니다. typeof
는 <code>wx:if
에서 사용할 수 없습니다. 문 typeof 연산자인 typeof
연산자는 {{}}
에서는 사용할 수 없으며 wxs
에서만 사용할 수 있습니다. 🎜데이터
를 초기화할 때 이것
을 이용해 가리킬 수는 없습니다. 현재 구성 요소 인스턴스(이것은 this === void 0
임), 즉 data
는 상수로만 초기화될 수 있습니다. . 🎜🎜데이터
를 초기화하기 위해 속성
또는 메서드
가 필요한 경우 첨부된
라이프 사이클에서만 를 전달할 수 있습니다. code> >this.setData
는 data
의 값을 업데이트합니다. 🎜而且,如果data.fn = this.methodName
,methodName
中如果调用了this
引用,这时this
指向的是data
,所以需要使用data.fn = this.methodName.bind(this)
。
popup
内容的大小不是由内容撑起来的,需要通过popup
组件的custom-class
定义一个类名,设置width
、height
来定义内容的尺寸。
在Taro
中的代码风格类React
,而vant-weapp
库中的代码风格为wxml
和wxs
风格。React
绑定事件是驼峰式,wxml
绑定事件是使用-
连字符分隔。
这就造成了Taro
使用vant-tree-select
组件时,onClickNav
和onClickItem
不会被vant-tree-select
识别,事件无法触发。
解决方案:对vant-tree-select
进行二次封装,事件原始触发通过this.$triggerEvent
传出驼峰式的事件类型,在Taro
中调用。
目前vant-weapp0.5.20
中,vant-tree-select
不支持单选。
注意@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.js
不需要再次编译,配置中新增编译时忽略echarts.js
。
weapp: { ... compile: { exclude: ['src/echarts-for-weixin/ec-canvas/echarts.js'] } }
可以在<span style="font-size: 14px;">(dispatch, getState) => {</span>
中使用。
将"本地设置"--> "上传时进行代码保护"取消勾选。
<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: ['', '']
改写成icon: ['\ue61e', '\ue62d']
。<rich-text nodes={}></rich-text>
如使用Taro.getStorageSync('key')
获取缓存数据,结果仍是异步返回。同步接口需要结合await
使用,才是真正的同步。
主包不需要特殊处理。
分包
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 == 'text' || metas.type == 'number' || metas.type == 'idcard' || metas.type == 'digit'}}" 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> ) }
对于options.styleIsolation = "apply-shared"
的应用:
如果是组件包裹组件,内部组件设置该配置,外部组件的样式依旧无法影响内部组件,Page()或Component()注册的页面级的样式才能影响到组件内部样式。
推荐教程:《微信小程序》
위 내용은 WeChat 미니 프로그램 개발 첫 경험의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!