一、使用v-for进行遍历时,对不同的按钮绑定不同的点击事件

<div class="computer-btns">
      <!--todo: 虽然设置了trigger为hover,但是仍然只在按钮被点击时才触发-->
      <a-tooltip
          placement="top"
          :mouse-leave-delay="0.2"
          v-for="item in computerBtns">
        <template #title>
          <span>prompt text</span>
        </template>
        <div
            class="computer-btn"
            @click="handleClick(item.type,item.value)">
          {{ item.name }}
        </div>
      </a-tooltip>


    </div>

通过模板字符串动态绑定,eval函数是关键

//done
/**
 * 根据字符串的类型动态设置不同按钮的点击事件
 * @param type
 */
const handleClick = (type, value) => {
  let fn = `handle${type}('${value}')`
  eval(fn)
}

//handleExchange是其中一个方法,当handleClick执行时,就会根据type和value进行动态执行
const handleExchange = () => {
  console.log('exchange')
}

#include "SoftKeyboard.h" SoftKeyboard::SoftKeyboard(QWidget *parent) : QDialog(parent), isUpperCase(false) { QGridLayout *layout = new QGridLayout(this); // 定义键盘布局内容 QStringList keys = {"1","2","3","4","5","6","7","8","9","0", "q","w","e","r","t","y","u","i","o","p", "a","s","d","f","g","h","j","k","l","Back", "Shift","z","x","c","v","b","n","m",",",".","Enter"}; int row = 0, col = 0; for (const QString &key : keys) { QPushButton *btn = new QPushButton(key, this); // 记录每个按钮的原始文本 btn->setProperty("originalText", key); // 如果是 Shift 按钮,则单独处理其点击事件 if (key == "Shift") { connect(btn, &QPushButton::clicked, this, [this]() { toggleCase(); // 切换大小写状态 }); } else { connect(btn, &QPushButton::clicked, this, &SoftKeyboard::onKeyClicked); } layout->addWidget(btn, row, col++); if (col >= 10) { col = 0; row++; } } } void SoftKeyboard::toggleCase() { isUpperCase = !isUpperCase; // 历所有按键并更新文本 QList<QPushButton*> buttons = findChildren<QPushButton*>(); foreach (QPushButton *button, buttons) { QString originalText = button->property("originalText").toString(); // 只针对字母按键进行大小写转换 if (originalText.length() == 1 && originalText.contains(QRegExp("[a-zA-Z]"))) { button->setText(isUpperCase ? originalText.toUpper() : originalText.toLower()); } } } // 连接 QLineEdit 的槽函数不变 void SoftKeyboard::linkLineEdit(QLineEdit *le) { linkedLineEdit = le; } // 键盘按下时的操作逻辑 void SoftKeyboard::onKeyClicked() { QPushButton *btn = qobject_cast<QPushButton*>(sender()); if (!btn || !linkedLineEdit) return; QString text = btn->text(); if (text == "Back") { linkedLineEdit->backspace(); } else if (text == "Enter") { this->hide(); } else { // 插入时尊重当前大小写状态 linkedLineEdit->insert(text); } } 修改代码,将数字键和符号单独放到另个界面,当通过点击某个按键切换
03-18
### 使用 `v-for` 指令的概述 在 Vue.js 中,`v-for` 是种基于个数组来渲染列表的方式[^3]。它允许开发者通过历数组或对象动态生成多个 DOM 元素或组件。 以下是关于 `v-for` 的基本用法以及些常见场景: --- #### 1. **基础用法** 当需要个数组并将其内容显示到页面时,可以使用如下语法: ```html <ul> <li v-for="item in items" :key="item.id">{{ item.name }}</li> </ul> <script> var app = new Vue({ el: '#app', data: { items: [ { id: 1, name: 'Apple' }, { id: 2, name: 'Banana' }, { id: 3, name: 'Cherry' } ] } }); </script> ``` 上述代码会生成个无序列表 `<ul>`,其中每项都对应于 `items` 数组中的元素,并且每项都有唯的键值绑定 (`:key`)。 --- #### 2. **获取索引值** 如果希望在历时知道当前项目的索引位置,则可以通过扩展语法 `(item, index)` 实现: ```html <ul> <li v-for="(item, index) in items" :key="index"> {{ index }} - {{ item.name }} </li> </ul> ``` 在此示例中,`index` 表示当前项目的位置,而 `item` 则表示具体的数组成员[^4]。 --- #### 3. **历对象属性** 除了支持数组外,`v-for` 还能够用来迭代 JavaScript 对象上的键/值对。其标准形式为 `(value, key, index)` 或者仅需前两者即可满足大多数情况下的需求。 ```html <dl> <dt v-for="(value, key) in object" :key="key">{{ key }}</dt> <dd>{{ value }}</dd> </dl> <script> var app = new Vue({ el: '#app', data: { object: { title: 'Vue For Directive Example', author: 'John Doe' } } }); </script> ``` 此片段展示了如何利用定义好的 JSON 结构体作为数据源创建描述列表(`<dl>`)标签结构。 --- #### 4. **性能优化——设置唯 Key** 为了提高虚拟 DOM 更新效率,在每次循环过程中都应该指定独无二的关键字给每个子节点(`:key`)。这有助于框架识别哪些部分发生了变化从而最小化重绘范围。 注意:虽然省略`:key`不会阻止功能正常运作,但它可能导致不必要的重新渲染行为或者警告消息提示。 --- #### 5. **结合其他指令** 正如前面提到过的那样[v-once], 它也可以同其他的特殊标记起工作比如条件判断语句(v-if)[^1]: ```html <ul> <li v-for="todo in todos" v-if="!todo.isCompleted" :key="todo.id"> {{ todo.text }} </li> </ul> ``` 这里我们过滤掉了已完成的任务条目(isCompleted=true),只展示那些尚未完成的工作事项清单。 --- ### 总结 综上所述,`v-for` 提供了种强大灵活的方式来处理集合型的数据集操作;无论是简单的枚举还是复杂嵌套关系都可以轻松应对。同时记得遵循最佳实践原则如始终提供明确的 keys 属性以获得更好的用户体验效果!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值