微信小程序-wx:key理解

本文详细解释了在微信小程序中使用 wx:key 的必要性和应用场景。通过示例代码展示了如何利用 wx:key 来维持列表项的状态,即使在列表项的位置发生变化或新增列表项时也能保持各自特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  个人感觉官方给出的例子不是很明确,官方解释如下:

wx:key

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 <input/> 中的输入内容,<switch/> 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符。

wx:key 的值以两种形式提供

  1. 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。
  2. 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如:

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

如不提供 wx:key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

示例代码:

<switch wx:for="{{objectArray}}" wx:key="unique" style="display: block;"> {{item.id}} </switch>
<button bindtap="switch"> Switch </button>
<button bindtap="addToFront"> Add to the front </button>

<switch wx:for="{{numberArray}}" wx:key="*this" style="display: block;"> {{item}} </switch>
<button bindtap="addNumberToFront"> Add to the front </button>

Page({
  data: {
    objectArray: [
      {id: 5, unique: 'unique_5'},
      {id: 4, unique: 'unique_4'},
      {id: 3, unique: 'unique_3'},
      {id: 2, unique: 'unique_2'},
      {id: 1, unique: 'unique_1'},
      {id: 0, unique: 'unique_0'},
    ],
    numberArray: [1, 2, 3, 4]
  },
  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
    }
    this.setData({
      objectArray: this.data.objectArray
    })
  },
  addToFront: function(e) {
    const length = this.data.objectArray.length
    this.data.objectArray = [{id: length, unique: 'unique_' + length}].concat(this.data.objectArray)
    this.setData({
      objectArray: this.data.objectArray
    })
  },
  addNumberToFront: function(e){
    this.data.numberArray = [ this.data.numberArray.length + 1 ].concat(this.data.numberArray)
    this.setData({
      numberArray: this.data.numberArray
    })
  }
})

这里写下个人的理解,有什么不对的地方希望大家指正:以<switch></switch>为例,如果没有wx:key,选中其中的某个按钮的时候,改变其顺序 或添加选项的时,选中的按钮时不回跟随 上个按钮改变顺序的,会一直在固定位子,如果如果有wx:key则相反,适用于列表或其他标签可以改变顺序或添加项目的情况
<think>好的,我现在需要处理用户关于微信小程序路由和wx:if条件渲染的问题。首先,用户提到了路由和wx:if,我需要将这两部分内容分开来讲解,同时结合提供的引用资料。 首先看路由部分。根据用户提供的引用,有三个引用是关于页面路由的。引用[1]提到page.json的配置和页面路由管理,引用[2]详细说明了wx.reLaunch的使用,引用[3]则涉及页面栈的概念。我需要整合这些信息,说明微信小程序中的路由方法,比如wx.navigateTo、wx.redirectTo、wx.reLaunch等,以及它们的区别和使用场景。同时,需要注意页面栈的管理,避免超过10层,这点在引用[3]中有提到。 然后是wx:if条件渲染。用户可能想知道如何在WXML中使用wx:if来控制元素的显示与隐藏。需要解释wx:if和hidden的区别,比如wx:if是动态添加或移除节点,而hidden只是切换显示样式。同时,注意事项部分要提到频繁切换时使用hidden可能更高效,避免频繁操作节点影响性能。 接下来要检查是否需要结合示例代码。用户提供的引用中有示例代码,比如引用[2]里的wx.reLaunch示例,可以引用过来。同时,wx:if的示例可能需要自己编写,比如根据条件显示不同的视图。 注意事项方面,路由部分需要强调页面栈的限制、不同API的区别,以及路由参数传递的方式。而wx:if需要注意不要与hidden混淆,以及在复杂条件下的性能优化。 最后,生成相关问题。要确保问题覆盖路由和条件渲染的常见疑惑,比如如何选择路由方法,wx:if和hidden的区别,页面栈的管理等。 现在需要确保回答结构清晰,分点说明路由和wx:if的使用方法及注意事项,并引用提供的资料中的内容,比如引用[2]中的reLaunch,引用[3]中的页面栈管理。同时,保持语言口语化,避免使用专业术语过多,但必要时需准确。 可能还需要检查是否有遗漏的信息,比如页面配置中的路由设置是否在page.json里,这部分引用[1]有提到,可能需要简要说明。不过用户的问题主要集中在路由方法和条件渲染,所以可能不需要深入page.json的配置细节,除非直接相关。 总结,回答的结构应该是: 1. 路由使用方法 - 主要API - 示例代码 - 注意事项(页面栈、参数传递) 2. wx:if条件渲染 - 基本语法 - 与hidden对比 - 注意事项(性能、复杂条件) 然后生成相关问题,确保覆盖这两个主题的常见问题。</think>### 微信小程序路由与wx:if条件渲染使用详解 #### 一、路由使用方法 1. **核心API及区别** - `wx.navigateTo`: 保留当前页面,跳转到新页面(页面栈最多10层)[^3] ```javascript wx.navigateTo({ url: '/pages/detail/detail?id=1' }) ``` - `wx.redirectTo`: 关闭当前页面,跳转到新页面(避免栈溢出) - `wx.reLaunch`: 关闭所有页面并打开新页面(适合重置应用状态)[^2] ```javascript wx.reLaunch({ url: '/pages/home/home' }) ``` 2. **页面栈管理** 通过`getCurrentPages()`获取页面栈实例,注意: - 页面层级不超过10层,否则触发自动重定向[^3] - 返回指定页面可使用`wx.navigateBack({ delta: 2 })` 3. **参数传递** 使用`url?key=value`传参,在目标页面的`onLoad`中通过`options`接收: ```javascript onLoad(options) { console.log(options.id) // 输出1 } ``` --- #### 二、wx:if条件渲染 1. **基础语法** 通过布尔值控制元素显隐,支持`wx:if`/`wx:elif`/`wx:else`: ```html <view wx:if="{{score > 90}}">优秀</view> <view wx:elif="{{score > 60}}">及格</view> <view wx:else>不及格</view> ``` 2. **与hidden的区别** | 特性 | wx:if | hidden | |------------|---------------------------|-------------------------| | 渲染方式 | 动态增删节点 | display:none切换 | | 适用场景 | 初始不渲染/低频切换 | 高频切换(如选项卡) | | 性能影响 | 切换成本高 | 切换成本低 | 3. **注意事项** - 避免在复杂布局中嵌套多层`wx:if`,可能导致渲染性能下降 - 结合`<block>`标签分组控制多个元素: ```html <block wx:if="{{isVIP}}"> <view>专属图标</view> <text>VIP特权说明</text> </block> ``` --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值