JSX 综合示例:以 Vue 3 为例

在前面的文章中,我们已经了解了 JSX 在 Vue 3 中的基础和高级用法。现在,让我们通过一个综合示例来展示如何将这些特性结合起来使用。

示例:待办事项应用

我们将创建一个简单的待办事项应用,其中包括添加、删除和标记完成的功能。

项目结构

  • App.jsx: 主组件
  • TodoItem.jsx: 待办事项组件

App.jsx

jsx 复制代码
import { ref } from 'vue';
import TodoItem from './TodoItem.jsx';

export default {
  setup() {
    const todos = ref([
      { id: 1, text: 'Learn Vue', completed: false },
      { id: 2, text: 'Learn JSX', completed: true },
    ]);

    const addTodo = () => {
      const id = todos.value.length ? Math.max(todos.value.map(t => t.id)) + 1 : 1;
      todos.value.push({ id, text: 'New Todo', completed: false });
    };

    const removeTodo = (id) => {
      todos.value = todos.value.filter(todo => todo.id !== id);
    };

    const toggleTodo = (id) => {
      const todo = todos.value.find(todo => todo.id === id);
      if (todo) {
        todo.completed = !todo.completed;
      }
    };

    return () => (
      <div>
        <h1>Todo List</h1>
        <button onClick={addTodo}>Add Todo</button>
        <ul>
          {todos.value.map(todo => (
            <TodoItem
              key={todo.id}
              todo={todo}
              onRemove={removeTodo}
              onToggle={toggleTodo}
            />
          ))}
        </ul>
      </div>
    );
  },
};

TodoItem.jsx

jsx 复制代码
export default {
  props: ['todo', 'onRemove', 'onToggle'],
  setup(props) {
    return () => (
      <li>
        <span style={{ textDecoration: props.todo.completed ? 'line-through' : 'none' }}>
          {props.todo.text}
        </span>
        <button onClick={() => props.onToggle(props.todo.id)}>Toggle</button>
        <button onClick={() => props.onRemove(props.todo.id)}>Remove</button>
      </li>
    );
  },
};

总结

在这个综合示例中,我们展示了如何使用 JSX 和 Vue 3 的 setup 函数来创建一个简单但功能完整的待办事项应用。我们使用了条件渲染、列表渲染和事件处理等高级特性。

这个示例应该能帮助你更好地理解如何在 Vue 3 中使用 JSX,以及如何将其与其他 Vue 3 特性结合起来创建复杂的应用。

希望这个综合示例和整个系列文章能帮助你更深入地了解 Vue 3 和 JSX 的强大功能!

相关推荐
头发还在的女程序员6 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_20107 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
梯度下降者16 小时前
Nuxt框架
vue.js·服务端渲染·全栈开发·混合渲染·nuxt框架
yuyuxun11 天前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
FungLeo1 天前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
码云社区1 天前
智慧物业系统选型指南:房屋档案、账单管理与报修协作
前端·javascript·vue.js·智慧物业
ruanno_top2 天前
表单重置后,验证码还显示已通过:Vue 受控组件的 3 种假同步
vue.js
ruanno_top2 天前
给标签页加 roving tabindex,整组反而键盘进不去了
vue.js
仨孩子的爹2 天前
CSS打印样式:字体族与行高在纸上的对照实测
vue.js
OpenTiny社区2 天前
AI Agent场景组件库 TinyRobot v1.0 正式发布:一站式打造您的AI助手
vue.js·github