小程序 --- 实现选中出现对勾功能(单选)(方法二)

本文介绍了一种在微信小程序中实现团队信息单选功能的方法。通过使用wxml、wxss和js代码,可以创建一个包含团队名称、队长名称和选择状态的组件。点击团队信息时,可以实现单选效果,同时更改被选中元素的状态。

方法一:https://blog.youkuaiyun.com/CEZLZ/article/details/106237068

方法二

示例

 

wxml:布局和 方法一 是一样的

<view class="team_info_item" wx:for="{{list}}" wx:key="id" bindtap="select" data-index="{{index}}">
    <view class="item_icon">
        <image mode="widthFix" src="https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=412796477,2371228780&fm=111&gp=0.jpg"></image>
    </view>
    <view class="team_content">
        <view>
            <view class="team_name">{{item.team_name}}</view>
            <view class="team_leader">队长:{{item.team_leader}}</view>
        </view>
        <view class="tick">
            <image hidden="{{item.flag}}" mode="widthFix" src="../../img/tick.png"></image>
        </view>
    </view>
</view>

 

wxss:样式和 方法一 一样

.team_info_item {
    display: flex;
    padding-left: 52rpx;
    padding-bottom: 20rpx;
}

.team_info_item .item_icon image {
    width: 90rpx;
    border-radius: 50%;
}

.team_info_item .team_content {
    display: flex;
    justify-content: space-between;
    padding-left: 28rpx;
    padding-right: 60rpx;
    width: 100%;
    color: #4a4a4a;

}

.team_info_item .team_content .team_name {
    font-size: 32rpx;
    font-weight: 600rpx;
    font-family: "SourceHanSansCN-Medium";
}

.team_info_item .team_content .team_leader {
    font-size: 28rpx;
    font-family: "SourceHanSansCN-Normal";

}

.team_info_item .team_content .tick {
    display: flex;
    align-items: center;
    width: 45rpx;
}

.team_info_item .team_content .tick image {
    width: 100%;
}

::-webkit-scrollbar {
    width: 0;
    height: 0;
    color: transparent;
}

 

js

Page({
  data: {
    list: [{
      team_name: '复仇者联盟',
      team_leader: '美国队长',
      flag: true
    },
    {
      team_name: '神奇四侠',
      team_leader: '鸣人',
      flag: true
    },
    {
      team_name: '航海王',
      team_leader: '海贼王',
      flag: true
    }]
  },

  /* 
    需求:
    + 实现元素之间的单选和切换
      - 当点击某个元素时,获取当前元素的 index
      - 让被点击的元素的 flag 取反
      - 未被点击的元素的 flag 为 true
  */

  select: function (e) {
    const _this = this
    // 获取被点击元素的下标
    const index = e.currentTarget.dataset.index
    // 复制一份 list 数组
    const list_cp = this.data.list
    // 循环便利 list
    list_cp.forEach((v, i) => {

      if (index === i) {
        // 修改被点击元素的 flag, 取反
        list_cp[index].flag = !list_cp[index].flag
        // 修改 data 中的 list
        _this.setData({
          list: list_cp
        })
      } else {
        // 未被点击的元素 flag 为 true,取消对勾
        v.flag = true
        _this.setData({
          list: list_cp
        })
      }
    })
  }
})

 

 

<think>好的,我现在需要解决用户关于微信小程序中自定义单选框样式的问题。首先,用户提到了引用3中的示例,其中包含了wxml、wxss和js代码。我应该先确认这些代码是否有效,以及是否有其他需要注意的地方。 首先,查看用户提供的示例代码。在wxml部分,单选框是通过radio-group和radio组件实现的,每个选项用label包裹,并使用了wx:for循环生成选项。这符合小程序的标准用法。接下来是wxss部分,用户尝试通过类选择器来修改单选框的样式,尤其是未选中选中状态下的样式。这里需要注意的是,小程序的radio组件内部结构可能比较复杂,直接通过子选择器来修改样式可能会有问题,尤其是涉及到组件自带的类名,比如.wx-radio-input。 然后,用户可能想知道如何正确覆盖默认样式。根据引用3中的代码,他们使用了radio .wx-radio-input来修改未选中时的样式,而选中后的样式则是通过radio .wx-radio-input-checked::before来实现的。但根据经验,小程序的某些组件样式可能受到隔离策略的影响,比如默认情况下自定义组件的样式是隔离的,但有时可能需要设置styleIsolation选项,如引用1提到的。如果用户的单选框是在自定义组件中,可能需要检查是否样式隔离导致自定义样式未生效,需要设置styleIsolation为'shared'或'apply-shared'。 另外,用户提供的代码中使用了伪元素::before来修改选中后的图标,这是常见的做法,但需要注意小程序是否支持这种方式。可能需要使用!important来覆盖默认样式,或者检查是否正确应用了类名。比如,是否应该使用.radio-group radio .wx-radio-input这样的选择器来增加优先级。 此外,用户可能需要知道如何调整单选框的大小、颜色、位置等具体样式属性。例如,在示例中,未选中时的边框颜色可能需要修改,或者选中后的背景颜色。可能需要提醒用户测试不同状态下的样式,确保在选中和未选中时都能正确显示。 最后,需要总结步骤:首先在wxml中构建结构,然后在wxss中通过特定选择器覆盖默认样式,注意样式隔离的问题,必要时调整组件选项,并提供完整的代码示例。同时,可能需要提到常见问题,比如样式不生效时的解决方法,如检查选择器是否正确、使用!important、调整样式隔离策略等。</think>### 微信小程序自定义单选框样式方法 微信小程序中自定义单选框样式主要通过修改组件内置的类名实现。以下为具体步骤和示例: #### 1. WXML 结构 使用 `radio-group` 包裹 `radio` 组件,并通过 `wx:for` 循环渲染选项: ```xml <radio-group class="radio-group" bindchange="radioChange"> <label wx:for="{{items}}" wx:key="{{index}}"> <radio value="{{item.name}}" />{{item.value}} </label> </radio-group> ``` #### 2. WXSS 样式 通过选择器覆盖默认样式,需注意**样式隔离策略**。若在自定义组件中使用,建议设置 `styleIsolation: 'shared'`[^1]: ```css /* 单选框容器 */ .radio-group { background-color: #f5f5f5; padding: 20rpx; } /* 单选框未选中样式 */ radio .wx-radio-input { width: 32rpx; height: 32rpx; border: 2rpx solid #999 !important; border-radius: 50%; } /* 单选选中样式 */ radio .wx-radio-input.wx-radio-input-checked::before { width: 44rpx; height: 44rpx; background-color: #da2728 !important; border-color: #da2728 !important; } ``` #### 3. JS 逻辑 定义选项数据及事件响应: ```javascript Page({ data: { items: [ { name: 'A', value: '选项A' }, { name: 'B', value: '选项B' } ] }, radioChange(e) { console.log('选中值:', e.detail.value); } }); ``` #### 关键点 - **样式覆盖优先级**:使用 `!important` 强制覆盖系统默认样式[^3] - **伪元素技巧**:通过 `::before` 修改选中后的对图标 - **组件隔离**:若在自定义组件中使用,需在 `component.js` 中配置 `styleIsolation`[^1] 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值