1. js、vue2、vue3、react类组件、react函数组件的特性
1.1 JavaScript(JS)特性
- 弱类型:JavaScript是一种弱类型语言,变量的类型可以在运行时动态改变。
- 基于原型的面向对象:JavaScript使用原型链来实现面向对象编程。
- 事件驱动:JavaScript可以通过事件监听和触发来实现交互功能。
- 动态性:JavaScript具有动态创建、修改和删除元素的能力。
- 广泛应用:JavaScript不仅可以在网页上运行,还可以在服务器端和移动端等平台上运行。
1.2 Vue2特性
- 双向数据绑定:Vue2使用数据绑定机制,实现了数据的双向绑定。
- 组件化开发:Vue2将界面拆分成独立的可复用组件,提高了开发效率和代码的可维护性。
- 虚拟DOM:Vue2使用虚拟DOM来提高渲染性能,减少真实DOM的操作次数。
- 生命周期钩子:Vue2提供了一系列的生命周期钩子函数,可以在组件的不同阶段执行相应的操作。
- 指令系统:Vue2提供了一套指令系统,可以用于操作DOM元素。
1.3 Vue3特性
- 更好的性能:Vue在虚拟DOM、编译器和响应式系统等方面进行了优化,提高了性能。
- 更小的体积:Vue3通过优化打包策略和使用Tree-shaking技术,减小了框架的体积。
- 更好的开发体验:Vue3引入了Composition API,提供了更灵活、可组合的函数式API,使得开发更加简单和直观。
- 更好的TypeScript支持:Vue3对TypeScript的支持更加友好,提供了更准确的类型推断和类型检查。
- 更好的可维护性:Vue3通过组合式API和更好的TypeScript支持,提高了代码的可维护性。
1.4 React类组件特性
- 生命周期方法:React类组件提供了一系列的生命周期方法,可以在组件的不同阶段执行相应的操作。
- 状态管理:React类组件使用this.state来管理组件的状态,并通过this.setState方法来更新状态。
- 事件处理:React类组件可以通过this.props来接收父组件传递的属性,并通过事件处理函数来处理用户的交互操作。
- 渲染方法:React类组件使用render方法来定义组件的渲染逻辑。
1.5 React函数组件特性
- 简洁易懂:React函数组件相比于React类组件更加简洁和易懂,代码量更少。
- 无状态:React函数组件是无状态的,不需要管理状态,只需要处理传入的props,并返回一个React元素。
- 高性能:React函数组件相比于React类组件具有更高的性能,因为函数组件不需要实例化和维护状态。
2. 使用js实现todolist
HTML部分:
<!DOCTYPE html>
<html>
<head><title>Todo List</title>
</head>
<body><h1>Todo List</h1><input type="text" id="taskInput"><button onclick="addTask()">Add Task</button><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()
函数,将保存的任务重新添加到任务列表中。
3. 使用vue2实现todolist
<!DOCTYPE html>
<html>
<head><title>Todo List</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body><div id="app"><h1>Todo List</h1><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)">Delete</button></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。
4. 使用vue3实现todolist
<template><div class="todo-list"><h1>Todo List</h1><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)">Delete</button></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
函数用于删除指定索引的任务。
5. 使用react类组件实现todolist
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 (<div><h1>Todo List</h1><form onSubmit={this.handleSubmit}><input type="text" value={newTodo} onChange={this.handleChange} /><button type="submit">Add</button></form><ul>{todos.map((todo, index) => (<li key={index}>{todo}<button onClick={() => this.handleDelete(index)}>Delete</button></li>))}</ul></div>);}
}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
组件导出供其他组件使用。
6. 使用react函数组件实现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 (<div><h1>Todo List</h1><input type="text" value={inputValue} onChange={handle} /><button onClick={handleAddTodo}>Add</button><ul>{todos.map((todo, index) => (<li key={index}>{todo}<button onClick={() => handleDeleteTodo(index)}>Delete</button></li>))}</ul></div>);
};export default TodoList;
使用React的useState
钩子来管理状态。todos
状态用于保存todo列表,inputValue
状态用于保存输入框的值。
handleInputChange
函数用于更新输入框的值,handleAddTodo
函数用于添加todo到列表中,handleDeleteTodo
函数用于删除指定索引的todo。
在渲染部分,使用<input>
元素来接收用户的输入,使用<button>
元素来添加todo,使用<ul>
和<li>
元素来展示todo列表。每个todo后面有一个删除按钮,点击按钮会调用handleDeleteTodo
函数删除对应的todo。