10.react的函数式组件,如何使用函数式组件将输入框
在 React 中,使用函数式组件创建一个简单的输入框可以通过以下方式实现:
import React, { useState } from 'react';
// 函数式组件
const MyComponent = () => {
// 使用 useState 创建一个状态变量来存储输入框的值
const [inputValue, setInputValue] = useState('');
// 定义一个函数来处理输入框变化事件
const handleInputChange = (event) => {
setInputValue(event.target.value); // 更新输入框的值
};
return (
<div>
{/* 使用 input 元素创建输入框,绑定 value 属性和 onChange 事件 */}
<input
type="text"
value={inputValue} // 将状态变量作为输入框的值
onChange={handleInputChange} // 监听输入框的变化事件
/>
{/* 显示输入框的值 */}
<p>Input value: {inputValue}</p>
</div>
);
};
export default MyComponent;
在上面的代码中,我们使用了 React 的 useState 钩子来创建一个状态变量 inputValue,并使用 setInputValue 函数来更新输入框的值。然后,我们使用 <input> 元素创建输入框,并将 inputValue 变量作为输入框的值,并且使用 handleInputChange 函数来处理输入框变化事件。最后,我们显示输入框的值。
这样,我们就创建了一个简单的函数式组件,包含了一个输入框,并且可以实时显示输入框的值。
11.浏览器缓存原理,协商缓存和强制缓存,还延申讲了cookie,session和localstory
浏览器缓存是指将静态资源保存在客户端浏览器中,以便下次访问相同资源时可以直接从本地获取,从而提高网页加载速度和减轻服务器压力。浏览器缓存主要分为两种类型:强制缓存和协商缓存。
-
强制缓存:
- 强制缓存通过设置响应头信息,告诉浏览器在特定时间内(比如一个小时)直接从本地缓存获取资源,不需要再次向服务器发起请求。
- 常见的强制缓存响应头字段包括
Cache-Control和Expires。 Cache-Control控制缓存策略,可以设置max-age参数来指定缓存时间,单位为秒。Expires是一个 HTTP1.0 的头字段,指定资源的过期时间,是一个绝对时间。- 如果资源的缓存时间未过期,则直接从缓存中加载资源,不向服务器发送请求。
-
协商缓存:
- 当资源的强制缓存过期后,浏览器会向服务器发送一个请求,询问资源是否有更新。
- 如果资源没有发生变化,则服务器返回 304 状态码,告诉浏览器直接从本地缓存获取资源。
- 常见的协商缓存响应头字段包括
Last-Modified和ETag。 Last-Modified表示资源的最后修改时间,浏览器在下次请求时会将该时间放在请求头中发送给服务器。ETag是一个资源的唯一标识符,用于判断资源是否发生变化。
3. Cookie、Session 和 LocalStorage:
- Cookie:是服务器发送到浏览器的一小段数据,存储在客户端的本地文件中,用于记录用户的状态信息。可以设置过期时间,可以被服务器和客户端读写。
- Session:是服务器端保存用户信息的一种机制,每个用户都会被分配一个唯一的会话 ID,通过会话 ID 来维持用户状态。通常会将会话 ID 存储在 Cookie 中,与服务器端的会话信息关联。
- LocalStorage:是浏览器提供的一种本地存储机制,用于将数据存储在客户端本地,与 Cookie 不同,LocalStorage 的数据不会随着 HTTP 请求被发送到服务器,适用于一些不需要与服务器交互的数据存储需求。
综上所述,浏览器缓存可以通过设置响应头信息来控制缓存策略,从而提高网页加载速度和减轻服务器压力。与此同时,Cookie、Session 和 LocalStorage 是用于在客户端存储用户信息和其他数据的常用机制。
12.伪数组,封装手写列表组件,封装注意点,key
伪数组是指类数组对象,它们具有类似数组的结构,但并非真正的数组对象。常见的伪数组包括函数的 arguments 对象、DOM 元素集合等。当需要对伪数组进行操作时,通常需要将其转换为真正的数组对象。
下面是封装手写列表组件的一般注意点:
-
接受数据:列表组件通常需要接受数据作为 props,可以是数组形式的数据,也可以是对象形式的数据。
-
遍历渲染:在组件内部遍历数据并渲染列表项,可以使用
v-for指令来遍历数组数据,也可以使用Object.keys()等方法遍历对象数据。 -
添加 key:在使用
v-for遍历渲染列表时,需要为每个列表项添加唯一的key属性,以便 Vue 进行高效的 DOM 更新。 -
事件处理:为列表项添加事件处理函数,处理用户的交互操作,比如点击事件、hover 事件等。
-
样式设计:设计列表项的样式,可以使用 CSS 来进行样式设计,也可以使用 CSS 框架或组件库来加速样式开发。
-
性能优化:当列表数据较多时,需要考虑性能优化问题,比如使用虚拟滚动来优化长列表的渲染性能。
下面是一个简单的示例代码,演示了如何封装一个手写列表组件:
<template>
<div>
<ul>
<li v-for="item in dataList" :key="item.id" @click="handleItemClick(item)">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
dataList: {
type: Array,
required: true
}
},
methods: {
handleItemClick(item) {
console.log('Clicked item:', item);
}
}
};
</script>
<style scoped>
/* 样式设计 */
ul {
list-style-type: none;
padding: 0;
}
li {
cursor: pointer;
padding: 10px;
border-bottom: 1px solid #ccc;
}
li:hover {
background-color: #f0f0f0;
}
</style>
在这个示例中,dataList 是作为 props 传递给列表组件的数组数据,使用 v-for 指令遍历渲染列表项,并为每个列表项添加了点击事件处理函数。同时,为了保证列表项的唯一性,使用了 :key 属性。最后,通过 CSS 进行了样式设计。
13.手写分页组件
下面是一个简单的手写分页组件示例:
<template>
<div>
<button @click="prevPage" :disabled="currentPage === 1">Previous</button>
<span>{{ currentPage }} / {{ totalPages }}</span>
<button @click="nextPage" :disabled="currentPage === totalPages">Next</button>
</div>
</template>
<script>
export default {
props: {
totalItems: {
type: Number,
required: true
},
itemsPerPage: {
type: Number,
default: 10
}
},
data() {
return {
currentPage: 1
};
},
computed: {
totalPages() {
return Math.ceil(this.totalItems / this.itemsPerPage);
}
},
methods: {
prevPage() {
if (this.currentPage > 1) {
this.currentPage--;
}
},
nextPage() {
if (this.currentPage < this.totalPages) {
this.currentPage++;
}
}
}
};
</script>
<style scoped>
/* 样式设计 */
button {
margin: 0 5px;
padding: 5px 10px;
cursor: pointer;
}
button:disabled {
cursor: not-allowed;
opacity: 0.5;
}
</style>
这个分页组件接受两个 props:totalItems 表示总条目数,itemsPerPage 表示每页显示的条目数(默认为 10)。组件内部通过计算属性 totalPages 计算总页数,并通过按钮的点击事件来实现上一页和下一页的功能。按钮的 disabled 属性根据当前页码是否为第一页或最后一页来控制是否可点击。
你可以根据自己的需求对分页组件进行扩展,比如添加页码跳转、显示更多页码等功能。
14.数组功底
数组是一种非常重要且常用的数据结构,它是一系列元素的集合,每个元素都有一个数字型的索引,用于标识元素在数组中的位置。以下是关于数组的一些基本概念和常用操作:
-
数组的创建:
- 在 JavaScript 中,可以使用数组字面量
[]或者Array构造函数来创建数组。 - 示例:
let arr1 = [1, 2, 3, 4, 5]; let arr2 = new Array(1, 2, 3, 4, 5);
- 在 JavaScript 中,可以使用数组字面量
-
数组的访问:
- 可以通过索引来访问数组中的元素,索引从 0 开始。
- 示例:
console.log(arr1[0]); // 输出:1
-
数组的长度:
- 使用
length属性可以获取数组的长度,也可以设置数组的长度。 - 示例:
console.log(arr1.length); // 输出:5
- 使用
-
数组的遍历:
- 可以使用
for循环、forEach()方法、map()方法等来遍历数组。 - 示例:
// 使用 for 循环遍历数组 for (let i = 0; i < arr1.length; i++) { console.log(arr1[i]); } // 使用 forEach() 方法遍历数组 arr1.forEach(item => { console.log(item); }); // 使用 map() 方法遍历数组 arr1.map(item => { console.log(item); });
- 可以使用
-
数组的增删改查:
- 增:使用
push()方法向数组末尾添加元素,使用unshift()方法向数组开头添加元素。 - 删:使用
pop()方法删除数组末尾的元素,使用shift()方法删除数组开头的元素,使用splice()方法根据索引删除指定位置的元素。 - 改:通过索引直接修改数组中的元素值。
- 查:使用
indexOf()方法或includes()方法查找元素在数组中的位置。 - 示例:
// 增 arr1.push(6); arr1.unshift(0); // 删 arr1.pop(); arr1.shift(); arr1.splice(1, 1); // 删除索引为 1 的元素 // 改 arr1[0] = 0; // 查 console.log(arr1.indexOf(3)); // 输出:2 console.log(arr1.includes(4)); // 输出:true
- 增:使用
-
数组的排序:
- 使用
sort()方法对数组进行排序,默认按照 Unicode 编码排序。 - 示例:
arr1.sort((a, b) => a - b); // 数字升序排序
- 使用
以上是关于数组的一些基本功底,掌握这些操作能够更加灵活地处理数组数据。在实际开发中,数组是非常常用的数据结构,熟练掌握数组的各种操作对于编写高效的 JavaScript 代码至关重要。
15.反问环节
- 自我介绍听感
- 面试流程
- 公司业务技术栈
16.到岗时间
作者:砸砸无所畏惧
链接:www.nowcoder.com/discuss/595…
来源:牛客网