小程序开发补坑

一 app.wxss

app.wxss里的样式是全局的

二 wx:for 内容循环

<block wx:for="{{hotelList}}">
    <navigator url="{{item.pageurl}}?title={{item.name}}">
        <view id="{{item.hotelID}}" data-index="index">
            <image class="leftBuilding" src="/images/building.png"></image>
            <text>{{item.name}}</text>
            <image src="/images/right-arrow.png" class="rightArrow"></image>
        </view>
    </navigator>
</block> 

三 wx:if 条件选择

<block wx:for="{{hotelList}}">
    <navigator url="{{item.pageurl}}?title={{item.name}}">
        <view id="{{item.hotelID}}" data-index="index">
            <image class="leftBuilding" src="/images/building.png"></image>
            <text>{{item.name}}</text>
            <image src="/images/right-arrow.png" class="rightArrow"></image>
        </view>
    </navigator>
</block> 

提示:也可以在{{这里面进行判断}},如:{{index>arr.length?’真’:’假’}},通常控制UI组件显示状态

四 navigator

实现前端a标签操作,实现页面跳转。

属性名类型默认值说明
urlString应用内的跳转链接
redirectBooleanfalse是否关闭当前页面
hover-classStringnavigator-hover指定点击时的样式类,当hover-class=”none”时,没有点击态效果
<navigator url="{{item.pageurl}}?title={{item.name}}">
    新页面打开 
</navigator> 

提示 function(options)
1.url页面地址后面可以挂参数,在目标页面的onload事件里的函数通过参数options来获取传递的参数。
2.参数数据类型如果是数组[],会被转换成字符串处理,可以在目标页通过split()处理。
3.如果参数式json对象{},传递前要先通过obj.JSON.stringify()转换成json字符串,在目标页面通过obj.JSON.parse()再转回json对象

五 事件

wxml:
    <input data-index="{{index}}" data-name="wc" value="{{item}}" bindtap="datasetTest"/>

js:
    datasetTest:function(e){
      /**
      *业务逻辑
      */
      console.log(e);
    }

运行截图:
这里写图片描述

提示 function(e)
标签内可以通过data-[自定义name]的形式携带参数,在事件里可以通过e.target.dataset.name的方式获取。

六 modal模态框

<modal 
        hidden="{{hidemodal}}"
        title="房间添加" 
        confirm-text="确定" 
        cancel-text="取消" 
        bindconfirm="bindAddConfirm" 
        bindcancel="bindAddCancel" 
    >
    确定添加新房间 {{newHotelName}} 吗?
</modal>

注意:
1.通过动态改变hidden的true/false来控制模态框的显示与隐藏。
2.模态框里的bindconfirm用来真正执行某一个事件操作

七 toast 消息提示框

常用方法wx.showToast(OBJECT)。

wx.showToast({
      title: '添加成功',
      icon: 'success',
      duration: 2000
    })

**注意:**icon只支持success,loading图标。

八 数组与UI

问题
1.增加或删除一个UI组件(这个UI组件是通过数据动态渲染的),其他UI组件的数据内容被刷新
2.数据同步问题
处理
—增加:

//添加房间输入框UI
  plusAddRoomUI:function(e){
    this.setData({
      moreRoomUI:this.data.moreRoomUI.concat([''])
    });
    console.log(this.data.moreRoomUI);
  }

—删除:

//删除添加房间输入框UI(任意位置删除或最后位置删除选一)
  removeRoomUI:function(e){ 
    /**
     * 从最后一个位置开始删除
     */
    // this.data.moreRoomUI.pop();//删除最后一个UI
    // this.setData({
    //   moreRoomUI:this.data.moreRoomUI
    // });

    /**
     * 任意位置删除,but 如果从非最后一个位置删除,那么其他位置的UI内容都会被刷新
     */
    this.data.moreRoomUI.splice(e.target.dataset.index,1);//删除单击(选中)的UI
    this.setData({
      moreRoomUI:this.data.moreRoomUI
    });
    console.log("id=",e.target.id,this.data.moreRoomUI);
  }

—动态改变 利用wx:key=”{{unique}}” 指定列表中项目的唯一的标识符

当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

wxml:
    <switch type="switch" wx:for="{{objectArray}}"  wx:key="id" id="{{index}}" >         {{item.unique}} 
    </switch>

js:
    switch: function(e) {
        const length = this.data.objectArray.length
        for (let i = 0; i < length; i++) {
          const x = Math.floor(Math.random() * length)
          const y = Math.floor(Math.random() * length)
          const temp = this.data.objectArray[x]
          this.data.objectArray[x] = this.data.objectArray[y]
          this.data.objectArray[y] = temp
          console.log(x,y);
        }
        this.setData({
          objectArray: this.data.objectArray
        })
    }

小总结:
一:向数组中添加数据
1.通过arr[arr.length]=”new value”
2.通过arr.push(‘new value’)
3.通过临时数组拼接原始数组的方式arr.concat(tempArr)或者tempArr.concat(arr)

二:删除数组中任意位置数组
1.通过:arr.splice(index,1)来删除,这句执行完后返回值是被删除的数据,但是会改变原数组的数据(已经删除了目标值的数组),只需要通过this.setData()方法重新渲染即可
2.如何获取index? 通过data-[name]传值【见上述】

九 设计规范

基于微信小程序轻快的特点,我们拟定了小程序界面设计指南和建议。
设计指南建立在充分尊重用户知情权与操作权的基础之上。旨在微信生态体系内,建立友好、高效、一致的用户体验,同时最大程度适应和支持不同需求,实现用户与小程序服务方的共赢。

1.友好礼貌

——-重点突出
——-流程明确

2.清晰明确

——-导航明确,来去自如
——-减少等待,反馈及时
——-异常可控,右路可退

3.便捷优雅

——-减少输入
——-避免误操作
——-利用接口提升性能

4.统一稳定
5.视觉规范

——-字体:大小、颜色
——-列表:间距
——-表单:提示与输入框的比例,对齐方式
——-按钮:可用、不可用,不同状态透明的不同
——-图标:完成、提醒、警告(视情况而定)

十 问题与不足

微信小程序 很大程度上简化了开发,但是微信为了维护自己产品生态,主张统一和谐而做了很多的限制,新设计的应用基本上无法照搬之前的模型,设计时要考虑“配色和谐统一”、“最多打开5个页面”、“底部导航2-5个”、无法更改顶部导航栏的功能菜单等等约束。否则可能会出现,页面链接失效,因为当前打开页面已经5个了,因此在设计页面跳转时部分页面不得不使用重定向方式(即关闭当前的页面,再打开新的页面)这样无法避免的产生程序后退不能回到真正的上一级页面。诸多小问题需要慢慢发现然后解决或者是顺应版本。

其他

<think>嗯,用户这次的问题是关于钉钉小程序自定义左上角内容并添加click事件的方法。之前用户提供了两个引用资料,但仔细看发现引用内容其实和当前需求关联不大:引用[1]提到跨域错误和click事件失效问题,引用[2]则是页面跳转的示例代码。需要完全聚焦于"自定义导航栏"这个核心需求。 查阅钉钉小程序官方文档发现,标准导航栏确实不支持自定义按钮事件。不过有个关键特性:enableNavigationBarCustom字段。当在app.json里启用这个配置后,整个导航栏就会变成空白画布,开发者可以用绝对定位的方式自由添加元素。这应该就是解决方案的核心。 考虑到用户可能需要具体操作指引,我准备分步骤说明:先在配置文件中开启自定义模式,然后在页面wxml里用绝对定位设计布局,最后在js里绑定事件。特别要注意坐标计算问题,因为不同机型状态栏高度可能不同,需要调用dd.getSystemInfo获取安全距离。 用户可能是企业应用开发者,遇到这种需求通常是为了放置返回首页或关闭菜单等操作按钮。上次用户提到click事件失效的问题,这次要特别强调bindtap的正确写法,避免和web开发的@click混淆。实际案例中很多人会忽略page.json的单独配置,这点也要重点提醒。 突然想到还有个隐患:自定义导航栏可能和下拉刷新冲突。不过文档里没提到相关限制,暂时先不增加复杂度,等用户反馈再充。最后上常见问题排查点,比如事件穿透和iPhone刘海屏适配,这些在实际开发中都是高频点。 相关扩展问题设计得很实用,特别是"如何继承原生返回功能"这个点。很多开发者自定义后才发现返回键没了,需要主动监听物理返回键事件,这个技术细节值得单独展开。 </think>在钉钉小程序中实现**自定义左上角内容并添加点击事件**,需要通过**自定义导航栏**功能实现。具体步骤如下: --- ### 步骤详解 #### 1. **启用自定义导航栏** 在 `app.json` 中全局开启自定义导航栏: ```json { "window": { "enableNavigationBarCustom": true // 启用自定义导航栏 } } ``` 或在具体页面的 `page.json` 中单独启用: ```json { "enableNavigationBarCustom": true } ``` #### 2. **编写页面结构 (WXML)** 在页面中通过绝对定位自定义左上角元素,并绑定点击事件: ```xml <!-- 自定义导航栏容器 --> <view class="custom-navbar"> <!-- 左上角自定义按钮 --> <view class="back-btn" bindtap="handleCustomClick"> <image src="/images/icon_back.png" mode="widthFix" /> <text>返回首页</text> </view> </view> <!-- 页面内容 --> <view class="content">...</view> ``` #### 3. **设置样式 (WXSS)** 通过绝对定位控制自定义元素位置,需兼容不同机型状态栏高度: ```css .custom-navbar { position: fixed; top: 0; width: 100%; height: 88rpx; /* 标准导航栏高度 */ z-index: 100; } .back-btn { position: absolute; left: 20rpx; top: var(--status-bar-height, 44rpx); /* 适配状态栏 */ display: flex; align-items: center; padding: 10rpx; } ``` #### 4. **绑定事件逻辑 (JS)** 在页面JS中实现点击事件处理: ```javascript Page({ handleCustomClick() { dd.alert({ title: '提示', content: '点击了自定义按钮', }); // 实际业务逻辑(如返回首页) // dd.switchTab({ url: '/pages/index/index' }); } }); ``` --- ### 关键注意事项 1. **兼容性问题** - 需动态获取状态栏高度:通过 `dd.getSystemInfoSync().statusBarHeight` 动态设置 `top` 值。 - 部分安卓机型需额外调整位置。 2. **事件绑定限制** - 原生导航栏组件(如返回箭头)**无法直接绑定事件**,必须完全自定义覆盖。 3. **页面滚动冲突** - 自定义导航栏需用 `position: fixed` 固定在顶部,避免被页面滚动影响。 --- ### 充说明 > **为什么不能直接修改原生导航栏?** > 钉钉/支付宝小程序的原生导航栏属于系统控件,开发者仅能通过 `dd.setNavigationBar` 修改标题/颜色等基础属性,无法添加自定义事件或插入元素[^1]。自定义导航栏是唯一可行方案。 > **实际效果参考** > 自定义导航栏需完全重写导航区域布局,可自由添加按钮、图标、搜索框等组件,并通过 `bindtap` 实现完整交互逻辑[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值