1.1 JavaScript(JS)特性
1.2 Vue2特性
1.3 Vue3特性
1.4 React类组件特性
1.5 React函数组件特性
HTML部分:
DOCTYPE html>
<html>
<head>
<title>Todo Listtitle>
head>
<body>
<h1>Todo Listh1>
<input type="text" id="taskInput">
<button onclick="addTask()">Add Taskbutton>
<ul id="taskList">ul>
<script src="script.js">script>
body>
html>
JavaScript部分:
// 保存任务的数组
var tasks = [];
// 添加任务
function addTask() {
var taskInput = document.getElementById("taskInput");
var taskList = document.getElementById("taskList");
// 创建新的任务项
var taskItem = document.createElement("li");
taskItem.innerHTML = taskInput.value;
taskList.appendChild(taskItem);
// 将任务到数组中
tasks.push(taskInput.value);
// 清空输入框
taskInput.value = "";
}
// 初始化任务列表
function initTaskList() {
var taskList = document.getElementById("taskList");
// 清空任务列表
taskList.innerHTML = "";
// 添加保存的任务
for (var i = 0; i < tasks.length; i++) {
var taskItem = document.createElement("li");
taskItem.innerHTML = tasks[i];
taskList.appendChild(taskItem);
}
}
// 页面加载时初始化任务列表
window.onload = function() {
initTaskList();
}
通过输入框输入任务,点击"Add Task"按钮将任务添加到任务列表中。同时,将任务保存在名为"tasks"的数组中,以便在页面刷新后能够保留之前添加的任务。在页面加载时,通过调用initTaskList()
函数,将保存的任务重新添加到任务列表中。
DOCTYPE html>
<html>
<head>
<title>Todo Listtitle>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<h1>Todo Listh1>
<input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a new todo">
<ul>
<li v-for="(todo, index) in todos" :key="index">
{{ todo }}
<button @click="removeTodo(index)">Deletebutton>
li>
ul>
div>
<script>
new Vue({
el: '#app',
data: {
todos: [],
newTodo: ''
},
methods: {
addTodo() {
if (this.newTodo.trim() !== '') {
this.todos.push(this.newTodo);
this.newTodo = '';
}
},
removeTodo(index) {
this.todos.splice(index, 1);
}
}
});
script>
body>
html>
使用Vue的双向绑定(v-model
)来实现输入框与数据的同步。当用户在输入框中按下回车键时,addTodo
方法会被调用,将新的todo添加到todos
数组中,并清空输入框。每个todo都有一个删除按钮,点击按钮时,removeTodo
方法会被调用,从todos
数组中移除对应的todo。
<template>
<div class="todo-list">
<h1>Todo Listh1>
<input v-model="task" placeholder="Add a task" @keyup.enter="addTask">
<ul>
<li v-for="(task, index) in tasks" :key="index">
<span>{{ task }}span>
<button @click="deleteTask(index)">Deletebutton>
li>
ul>
div>
template>
<script>
import { ref } from 'vue';
export default {
name: 'TodoList',
setup() {
const task = ref('');
const tasks = ref([]);
const addTask = () => {
if (task.value.trim() !== '') {
tasks.value.push(task.value);
task.value = '';
}
};
const deleteTask = (index) => {
tasks.value.splice(index, 1);
};
return {
task,
tasks,
addTask,
deleteTask
};
}
};
script>
<style>
.todo-list {
max-width: 400px;
margin: 0 auto;
padding: 20px;
font-family: Arial, sans-serif;
}
input {
width: 100%;
padding: 10px;
margin-bottom: 10px;
}
ul {
list-style: none;
padding: 0;
}
li {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
border-bottom: 1px solid #ccc;
}
button {
padding: 5px 10px;
background-color: #ff0000;
color: #fff;
border: none;
cursor: pointer;
}
style>
使用v-model
指令将输入框的值与task
绑定,使其成为双向绑定的。使用v-for
指令遍历tasks
数组,并使用:key
绑定每个任务的索引。点击"Delete"按钮时,会调用deleteTask
函数删除对应的任务。
在setup
函数中,使用ref
函数来创建响应式的数据task
和tasks
。task
用于存储输入框中的值,tasks
用于存储所有的任务列表。
addTask
函数用于将输入框中的值添加到任务列表中,并清空输入框。deleteTask
函数用于删除指定索引的任务。
import React from 'react';
class TodoList extends React.Component {
constructor(props) {
super(props);
this.state = {
todos: [],
newTodo: ''
};
}
handleChange = (event) => {
this.setState({ newTodo: event.target.value });
}
handleSubmit = (event) => {
event.preventDefault();
const { todos, newTodo } = this.state;
if (newTodo.trim() !== '') {
this.setState({
todos: [...todos, newTodo],
newTodo: ''
});
}
}
handleDelete = (index) => {
const { todos } = this.state;
this.setState({
todos: todos.filter((todo, i) => i !== index)
});
}
render() {
const { todos, newTodo } = this.state;
return (
Todo List
{todos.map((todo, index) => (
-
{todo}
))}
);
}
}
export default TodoList;
使用React的类组件来实现一个简单的todolist。组件的状态包括一个todos数组和一个newTodo字符串,分别用于存储待办事项列表和用户输入的新待办事项。
在handleChange
方法中,通过event.target.value
获取用户输入的值,并将其更新到newTodo
状态中。
在handleSubmit
方法中,调用event.preventDefault()
来阻止表单的默认提交行为,检查newTodo
是否为空字符串,如果不为空,就将其添加到todos
数组中,并将newTodo
重置为空字符串。
在handleDelete
方法中,使用filter
方法来过滤掉要删除的待办事项。
在render
方法中,使用JSX语法来渲染组件的结构。当用户输入新待办事项时,通过onChange
事件监听输入框的变化,并调用handleChange
方法更新newTodo
状态。当用户点击添加按钮时,通过onSubmit
事件监听表单的提交,并调用handleSubmit
方法处理提交事件。待办事项列表通过map
方法遍历todos
数组来渲染。每个待办事项都有一个删除按钮,点击按钮时调用handleDelete
方法删除对应的待办事项。
最后,将TodoList
组件导出供其他组件使用。
import React, { useState } from 'react';
const TodoList = () => {
const [todos, setTodos] = useState([]);
const [inputValue, setInputValue] = useState('');
const handleInputChange = (e) => {
setInputValue(e.target.value);
};
const handleAddTodo = () => {
if (inputValue.trim() !== '') {
setTodos([...todos, inputValue]);
setInputValue('');
}
};
const handleDeleteTodo = (index) => {
const newTodos = [...todos];
newTodos.splice(index, 1);
setTodos(newTodos);
};
return (
Todo List
{todos.map((todo, index) => (
-
{todo}
))}
);
};
export default TodoList;
使用React的useState
钩子来管理状态。todos
状态用于保存todo列表,inputValue
状态用于保存输入框的值。
handleInputChange
函数用于更新输入框的值,handleAddTodo
函数用于添加todo到列表中,handleDeleteTodo
函数用于删除指定索引的todo。
在渲染部分,使用元素来接收用户的输入,使用
元素来添加todo,使用
和元素来展示todo列表。每个todo后面有一个删除按钮,点击按钮会调用
handleDeleteTodo
函数删除对应的todo。