前端项目JavaScript知识点总结
前端项目JavaScript知识点总结
1. Vue 3 Composition API
1.1 <script setup> 语法
<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
// 其他导入...
// 组件逻辑...
</script>
- 特点:简化组件代码,自动暴露变量和函数到模板
- 使用场景:Vue 3 项目中的组件开发
1.2 响应式变量 (ref)
const stats = ref({
userCount: 0,
articleCount: 0,
tagCount: 0,
commentCount: 0
})
const recentActivities = ref([])
- 特点:创建响应式数据,通过
.value访问和修改 - 使用场景:需要在模板中响应变化的数据
1.3 生命周期钩子 (onMounted)
onMounted(() => {
loadStats()
loadRecentActivities()
})
- 特点:组件挂载后执行
- 使用场景:初始化数据加载、DOM 操作等
1.4 路由钩子 (useRouter)
const router = useRouter()
const goBack = () => {
router.back()
}
// 路由跳转
router.push('/admin/users')
- 特点:访问路由实例,进行导航操作
- 使用场景:页面跳转、历史记录操作
2. 异步编程
2.1 async/await 语法
const loadStats = async () => {
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
}
- 特点:以同步方式编写异步代码,提高可读性
- 使用场景:API 调用、异步数据处理
2.2 try/catch 错误处理
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
- 特点:捕获和处理异常
- 使用场景:可能出错的操作,如网络请求
3. 函数定义
3.1 箭头函数
const goBack = () => {
router.back()
}
const formatDate = (dateString) => {
const date = new Date(dateString)
return date.toLocaleString('zh-CN')
}
- 特点:简洁语法,绑定词法作用域的
this - 使用场景:回调函数、简短的函数定义
3.2 普通函数
function getActivityType(type) {
const typeMap = {
checkin: 'success',
article: 'primary',
comment: 'info',
like: 'warning'
}
return typeMap[type] || 'info'
}
- 特点:传统函数定义方式
- 使用场景:复杂逻辑的函数,需要
this上下文的情况
4. 数据处理
4.1 对象解构
// 从响应中解构数据
const { activities } = await getRecentActivities()
recentActivities.value = activities || []
- 特点:从对象中提取属性
- 使用场景:API 响应处理、函数参数处理
4.2 数组操作
// 数组遍历(在模板中)
<el-timeline-item
v-for="activity in recentActivities"
:key="activity.id"
:timestamp="formatDate(activity.created_at)"
placement="top"
:type="getActivityType(activity.activity_type)"
>
- 特点:遍历数组,渲染列表
- 使用场景:数据展示、列表渲染
4.3 日期处理
const formatDate = (dateString) => {
const date = new Date(dateString)
return date.toLocaleString('zh-CN')
}
- 特点:日期对象的创建和格式化
- 使用场景:时间显示、日期计算
5. 映射/查找表
5.1 对象作为映射表
const getActivityType = (type) => {
const typeMap = {
checkin: 'success',
article: 'primary',
comment: 'info',
like: 'warning'
}
return typeMap[type] || 'info'
}
const getActivityTypeName = (type) => {
const typeMap = {
checkin: '签到',
article: '文章',
comment: '评论',
like: '点赞'
}
return typeMap[type] || type
}
- 特点:使用对象键值对进行快速查找
- 使用场景:类型转换、状态映射、配置查找
6. 模块导入
6.1 导入 Vue 相关模块
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
- 特点:按需导入,减小打包体积
- 使用场景:使用 Vue 的核心功能
6.2 导入 API 函数
import { getAdminStats, getRecentActivities } from '@/api/admin'
- 特点:模块化 API 调用
- 使用场景:网络请求、数据获取
6.3 导入 UI 组件和图标
import { ElMessage } from 'element-plus'
import { User, Document, PriceTag, ChatDotRound, Operation, Clock, Folder, Timer, ArrowLeft } from '@element-plus/icons-vue'
- 特点:组件库的使用
- 使用场景:UI 界面构建
7. 事件处理
7.1 点击事件处理
<el-button type="primary" plain @click="goBack" style="margin-right: 16px;">
<el-icon><ArrowLeft /></el-icon>
返回
</el-button>
- 特点:绑定事件处理函数
- 使用场景:用户交互、按钮点击
7.2 路由导航
<el-button type="primary" class="action-btn" @click="router.push('/admin/users')">
<el-icon><User /></el-icon>
用户管理
</el-button>
- 特点:通过点击事件触发路由跳转
- 使用场景:页面导航、功能切换
8. 模板语法
8.1 插值表达式
<div class="stat-value">{{ stats.userCount }}</div>
<div class="stat-label">用户总数</div>
- 特点:在模板中显示变量值
- 使用场景:数据展示
8.2 指令
<el-timeline-item
v-for="activity in recentActivities"
:key="activity.id"
:timestamp="formatDate(activity.created_at)"
placement="top"
:type="getActivityType(activity.activity_type)"
>
<div class="activity-content">
<span class="activity-type" :class="`type-${activity.activity_type}`">{{ getActivityTypeName(activity.activity_type) }}</span>
<span class="activity-desc">{{ activity.content }}</span>
<span class="activity-user" v-if="activity.user_id">
<el-tag size="small" effect="plain">用户 ID: {{ activity.user_id }}</el-tag>
</span>
</div>
</el-timeline-item>
- 特点:提供特殊功能的模板语法
- 使用场景:条件渲染、列表渲染、属性绑定
9. CSS 变量
9.1 使用 CSS 变量
.admin-dashboard {
min-height: 100vh;
background: var(--bg-main);
transition: background-color var(--transition-normal);
}
.stat-value {
font-size: 28px;
font-weight: bold;
color: var(--text-dark);
margin-bottom: 4px;
transition: color var(--transition-normal);
}
- 特点:使用变量管理样式,便于主题切换
- 使用场景:主题系统、样式统一管理
10. 响应式设计
10.1 媒体查询
@media (max-width: 768px) {
.action-btn {
height: 45px;
font-size: 13px;
}
}
- 特点:根据屏幕尺寸调整样式
- 使用场景:适配不同设备屏幕
11. 组件通信
11.1 Props 和 Events
(在其他组件中使用,本文件未直接展示)
- 特点:父子组件之间的数据传递和事件触发
- 使用场景:组件化开发中的数据流转
12. 状态管理
12.1 组件内状态
const stats = ref({
userCount: 0,
articleCount: 0,
tagCount: 0,
commentCount: 0
})
const recentActivities = ref([])
- 特点:组件内部的状态管理
- 使用场景:组件级数据管理
12.2 全局状态管理
(在其他文件中使用,本文件未直接展示)
- 特点:跨组件的状态共享
- 使用场景:用户信息、应用配置等全局数据
13. API 调用
13.1 封装 API 函数
import { getAdminStats, getRecentActivities } from '@/api/admin'
const loadStats = async () => {
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
}
const loadRecentActivities = async () => {
try {
const response = await getRecentActivities()
recentActivities.value = response.activities || []
} catch (error) {
ElMessage.error('加载最近活动失败')
}
}
- 特点:模块化 API 调用,统一错误处理
- 使用场景:数据获取、业务逻辑处理
14. 错误处理
14.1 网络错误处理
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
- 特点:捕获网络请求错误,提供用户反馈
- 使用场景:API 调用、异步操作
15. 性能优化
15.1 组件懒加载
(在路由配置中使用,本文件未直接展示)
- 特点:按需加载组件,减少初始加载时间
- 使用场景:大型应用的路由配置
15.2 计算属性和缓存
(在其他组件中使用,本文件未直接展示)
- 特点:缓存计算结果,避免重复计算
- 使用场景:复杂数据计算、派生状态
JavaScript 中 window 对象的方法 - 项目代码示例分析
1. window 对象概述
window 对象是 JavaScript 中全局对象的实例,代表浏览器窗口。它提供了许多方法和属性,用于操作浏览器窗口、处理用户交互、访问浏览器功能等。
2. 项目中使用的 window 对象方法
通过分析项目代码,我发现以下 window 对象方法的使用:
2.1 localStorage API
功能:提供本地存储功能,数据持久保存在浏览器中。
使用示例:
// 从 localStorage 获取数据
user: JSON.parse(localStorage.getItem('user')) || null,
token: localStorage.getItem('token') || null,
// 向 localStorage 存储数据
localStorage.setItem('user', JSON.stringify(user))
localStorage.setItem('token', token)
// 从 localStorage 删除数据
localStorage.removeItem('user')
localStorage.removeItem('token')
说明:
localStorage.getItem(key):获取指定键名的数据localStorage.setItem(key, value):存储数据到指定键名,数据必须是字符串localStorage.removeItem(key):删除指定键名的数据- 由于 localStorage 只能存储字符串,需要使用
JSON.parse()和JSON.stringify()处理对象数据
2.2 matchMedia API
功能:检测媒体查询条件是否匹配,常用于响应式设计。
使用示例:
// 检测系统是否为深色模式
isDarkMode: (state) => {
if (state.followSystem) {
return window.matchMedia('(prefers-color-scheme: dark)').matches
}
return state.themeMode === 'dark'
},
// 监听系统主题变化
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
if (this.followSystem) {
this.applyTheme()
}
})
}
说明:
window.matchMedia(mediaQueryString):返回一个 MediaQueryList 对象- MediaQueryList 对象表示媒体查询条件的匹配状态
MediaQueryList.matches:布尔值,表示媒体查询是否匹配MediaQueryList.addEventListener('change', callback):监听媒体查询状态变化
2.3 document 对象(window 的属性)
功能:代表当前文档,提供操作 DOM 的方法。
使用示例:
// 创建 DOM 元素
const confetti = document.createElement('div')
// 获取根元素
const html = document.documentElement
// 操作 DOM 类和属性
html.classList.add('dark')
html.setAttribute('data-theme', 'dark')
说明:
document.createElement(tagName):创建新的 DOM 元素document.documentElement:获取 HTML 根元素element.classList.add(className):添加 CSS 类element.setAttribute(name, value):设置元素属性
2.4 事件对象属性(间接使用 window)
功能:在事件处理函数中获取鼠标位置等信息。
使用示例:
const handleMouseMove = (event) => {
const rect = event.currentTarget.getBoundingClientRect()
mouseX.value = event.clientX - rect.left - rect.width / 2
mouseY.value = event.clientY - rect.top - rect.height / 2
}
说明:
event.clientX和event.clientY:鼠标指针相对于浏览器窗口的水平和垂直坐标- 这些属性虽然是事件对象的属性,但事件对象是由 window 对象创建和分发的
3. 其他常见的 window 对象方法
虽然项目中没有直接使用,但以下是一些常用的 window 对象方法:
| 方法 | 功能 | 示例 |
|---|---|---|
window.alert() |
显示警告对话框 | window.alert('登录成功!') |
window.confirm() |
显示确认对话框 | if (window.confirm('确定要删除吗?')) { /* 执行删除 */ } |
window.prompt() |
显示输入对话框 | const name = window.prompt('请输入您的名字:') |
window.open() |
打开新窗口 | window.open('https://example.com', '_blank') |
window.close() |
关闭当前窗口 | window.close() |
window.scrollTo() |
滚动到指定位置 | window.scrollTo(0, 0) |
window.location |
操作当前 URL | window.location.href = '/home' |
window.history |
操作浏览器历史 | window.history.back() |
window.setTimeout() |
延迟执行函数 | window.setTimeout(() => { /* 执行操作 */ }, 1000) |
window.setInterval() |
定期执行函数 | window.setInterval(() => { /* 执行操作 */ }, 1000) |
4. 代码优化建议
4.1 本地存储操作封装
当前代码:
// 读取数据
user: JSON.parse(localStorage.getItem('user')) || null,
// 存储数据
localStorage.setItem('user', JSON.stringify(user))
优化建议:
// 封装本地存储操作
const storage = {
get: (key, defaultValue = null) => {
try {
const item = localStorage.getItem(key)
return item ? JSON.parse(item) : defaultValue
} catch (error) {
console.error('Error getting from localStorage:', error)
return defaultValue
}
},
set: (key, value) => {
try {
localStorage.setItem(key, JSON.stringify(value))
} catch (error) {
console.error('Error setting to localStorage:', error)
}
},
remove: (key) => {
try {
localStorage.removeItem(key)
} catch (error) {
console.error('Error removing from localStorage:', error)
}
}
}
// 使用
user: storage.get('user'),
// ...
storage.set('user', user)
4.2 媒体查询监听优化
当前代码:
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
if (this.followSystem) {
this.applyTheme()
}
})
}
优化建议:
// 存储媒体查询对象,方便后续移除监听器
let darkModeMediaQuery = null
initTheme() {
this.applyTheme()
// 监听系统主题变化
if (window.matchMedia) {
darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
const handleThemeChange = (e) => {
if (this.followSystem) {
this.applyTheme()
}
}
darkModeMediaQuery.addEventListener('change', handleThemeChange)
// 存储清理函数
this.cleanup = () => {
if (darkModeMediaQuery) {
darkModeMediaQuery.removeEventListener('change', handleThemeChange)
}
}
}
},
// 在组件卸载时调用清理函数
// 注意:在 Pinia store 中可能需要不同的清理机制
5. 总结
window 对象是 JavaScript 中非常重要的全局对象,它提供了许多方法和属性,用于操作浏览器窗口、处理用户交互、访问浏览器功能等。在项目中,我们主要使用了以下 window 对象相关的功能:
- localStorage API:用于持久化存储用户数据和主题偏好
- matchMedia API:用于检测和监听系统主题变化
- document 对象:用于操作 DOM 元素
- 事件对象属性:用于获取鼠标位置等信息
这些方法的使用使得我们的应用能够:
- 保持用户登录状态
- 记住用户的主题偏好
- 响应系统主题变化
- 实现交互式动画效果
通过合理使用 window 对象的方法,我们可以创建更加用户友好、功能丰富的 Web 应用。# 前端项目JavaScript知识点总结
1. Vue 3 Composition API
1.1 <script setup> 语法
<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
// 其他导入...
// 组件逻辑...
</script>
- 特点:简化组件代码,自动暴露变量和函数到模板
- 使用场景:Vue 3 项目中的组件开发
1.2 响应式变量 (ref)
const stats = ref({
userCount: 0,
articleCount: 0,
tagCount: 0,
commentCount: 0
})
const recentActivities = ref([])
- 特点:创建响应式数据,通过
.value访问和修改 - 使用场景:需要在模板中响应变化的数据
1.3 生命周期钩子 (onMounted)
onMounted(() => {
loadStats()
loadRecentActivities()
})
- 特点:组件挂载后执行
- 使用场景:初始化数据加载、DOM 操作等
1.4 路由钩子 (useRouter)
const router = useRouter()
const goBack = () => {
router.back()
}
// 路由跳转
router.push('/admin/users')
- 特点:访问路由实例,进行导航操作
- 使用场景:页面跳转、历史记录操作
2. 异步编程
2.1 async/await 语法
const loadStats = async () => {
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
}
- 特点:以同步方式编写异步代码,提高可读性
- 使用场景:API 调用、异步数据处理
2.2 try/catch 错误处理
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
- 特点:捕获和处理异常
- 使用场景:可能出错的操作,如网络请求
3. 函数定义
3.1 箭头函数
const goBack = () => {
router.back()
}
const formatDate = (dateString) => {
const date = new Date(dateString)
return date.toLocaleString('zh-CN')
}
- 特点:简洁语法,绑定词法作用域的
this - 使用场景:回调函数、简短的函数定义
3.2 普通函数
function getActivityType(type) {
const typeMap = {
checkin: 'success',
article: 'primary',
comment: 'info',
like: 'warning'
}
return typeMap[type] || 'info'
}
- 特点:传统函数定义方式
- 使用场景:复杂逻辑的函数,需要
this上下文的情况
4. 数据处理
4.1 对象解构
// 从响应中解构数据
const { activities } = await getRecentActivities()
recentActivities.value = activities || []
- 特点:从对象中提取属性
- 使用场景:API 响应处理、函数参数处理
4.2 数组操作
// 数组遍历(在模板中)
<el-timeline-item
v-for="activity in recentActivities"
:key="activity.id"
:timestamp="formatDate(activity.created_at)"
placement="top"
:type="getActivityType(activity.activity_type)"
>
- 特点:遍历数组,渲染列表
- 使用场景:数据展示、列表渲染
4.3 日期处理
const formatDate = (dateString) => {
const date = new Date(dateString)
return date.toLocaleString('zh-CN')
}
- 特点:日期对象的创建和格式化
- 使用场景:时间显示、日期计算
5. 映射/查找表
5.1 对象作为映射表
const getActivityType = (type) => {
const typeMap = {
checkin: 'success',
article: 'primary',
comment: 'info',
like: 'warning'
}
return typeMap[type] || 'info'
}
const getActivityTypeName = (type) => {
const typeMap = {
checkin: '签到',
article: '文章',
comment: '评论',
like: '点赞'
}
return typeMap[type] || type
}
- 特点:使用对象键值对进行快速查找
- 使用场景:类型转换、状态映射、配置查找
6. 模块导入
6.1 导入 Vue 相关模块
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
- 特点:按需导入,减小打包体积
- 使用场景:使用 Vue 的核心功能
6.2 导入 API 函数
import { getAdminStats, getRecentActivities } from '@/api/admin'
- 特点:模块化 API 调用
- 使用场景:网络请求、数据获取
6.3 导入 UI 组件和图标
import { ElMessage } from 'element-plus'
import { User, Document, PriceTag, ChatDotRound, Operation, Clock, Folder, Timer, ArrowLeft } from '@element-plus/icons-vue'
- 特点:组件库的使用
- 使用场景:UI 界面构建
7. 事件处理
7.1 点击事件处理
<el-button type="primary" plain @click="goBack" style="margin-right: 16px;">
<el-icon><ArrowLeft /></el-icon>
返回
</el-button>
- 特点:绑定事件处理函数
- 使用场景:用户交互、按钮点击
7.2 路由导航
<el-button type="primary" class="action-btn" @click="router.push('/admin/users')">
<el-icon><User /></el-icon>
用户管理
</el-button>
- 特点:通过点击事件触发路由跳转
- 使用场景:页面导航、功能切换
8. 模板语法
8.1 插值表达式
<div class="stat-value">{{ stats.userCount }}</div>
<div class="stat-label">用户总数</div>
- 特点:在模板中显示变量值
- 使用场景:数据展示
8.2 指令
<el-timeline-item
v-for="activity in recentActivities"
:key="activity.id"
:timestamp="formatDate(activity.created_at)"
placement="top"
:type="getActivityType(activity.activity_type)"
>
<div class="activity-content">
<span class="activity-type" :class="`type-${activity.activity_type}`">{{ getActivityTypeName(activity.activity_type) }}</span>
<span class="activity-desc">{{ activity.content }}</span>
<span class="activity-user" v-if="activity.user_id">
<el-tag size="small" effect="plain">用户 ID: {{ activity.user_id }}</el-tag>
</span>
</div>
</el-timeline-item>
- 特点:提供特殊功能的模板语法
- 使用场景:条件渲染、列表渲染、属性绑定
9. CSS 变量
9.1 使用 CSS 变量
.admin-dashboard {
min-height: 100vh;
background: var(--bg-main);
transition: background-color var(--transition-normal);
}
.stat-value {
font-size: 28px;
font-weight: bold;
color: var(--text-dark);
margin-bottom: 4px;
transition: color var(--transition-normal);
}
- 特点:使用变量管理样式,便于主题切换
- 使用场景:主题系统、样式统一管理
10. 响应式设计
10.1 媒体查询
@media (max-width: 768px) {
.action-btn {
height: 45px;
font-size: 13px;
}
}
- 特点:根据屏幕尺寸调整样式
- 使用场景:适配不同设备屏幕
11. 组件通信
11.1 Props 和 Events
(在其他组件中使用,本文件未直接展示)
- 特点:父子组件之间的数据传递和事件触发
- 使用场景:组件化开发中的数据流转
12. 状态管理
12.1 组件内状态
const stats = ref({
userCount: 0,
articleCount: 0,
tagCount: 0,
commentCount: 0
})
const recentActivities = ref([])
- 特点:组件内部的状态管理
- 使用场景:组件级数据管理
12.2 全局状态管理
(在其他文件中使用,本文件未直接展示)
- 特点:跨组件的状态共享
- 使用场景:用户信息、应用配置等全局数据
13. API 调用
13.1 封装 API 函数
import { getAdminStats, getRecentActivities } from '@/api/admin'
const loadStats = async () => {
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
}
const loadRecentActivities = async () => {
try {
const response = await getRecentActivities()
recentActivities.value = response.activities || []
} catch (error) {
ElMessage.error('加载最近活动失败')
}
}
- 特点:模块化 API 调用,统一错误处理
- 使用场景:数据获取、业务逻辑处理
14. 错误处理
14.1 网络错误处理
try {
const response = await getAdminStats()
stats.value = response
} catch (error) {
ElMessage.error('加载统计数据失败')
}
- 特点:捕获网络请求错误,提供用户反馈
- 使用场景:API 调用、异步操作
15. 性能优化
15.1 组件懒加载
(在路由配置中使用,本文件未直接展示)
- 特点:按需加载组件,减少初始加载时间
- 使用场景:大型应用的路由配置
15.2 计算属性和缓存
(在其他组件中使用,本文件未直接展示)
- 特点:缓存计算结果,避免重复计算
- 使用场景:复杂数据计算、派生状态
总结
本项目中使用的 JavaScript 知识点涵盖了现代前端开发的核心内容,包括:
- Vue 3 Composition API:使用
<script setup>、ref、onMounted等 - 异步编程:
async/await、try/catch - 函数式编程:箭头函数、纯函数
- 数据处理:对象解构、数组操作、日期处理
- 模块化开发:ES6 模块导入导出
- 响应式设计:CSS 变量、媒体查询
- 组件化开发:Vue 组件、事件处理
- API 集成:异步 API 调用、错误处理
- 状态管理:组件内状态、全局状态
- 性能优化:组件懒加载、计算属性
这些知识点构成了现代前端开发的基础,掌握它们对于构建高质量的前端应用至关重要。
我需要先了解项目的前端结构,然后查看代码中使用window对象方法的例子。
toolName: view_folder
status: success
c:\Users\hyx\Desktop\项目\Blog Platform\frontend
我需要查看Login.vue文件的内容,因为用户已经打开了这个文件,并且它可能包含window对象方法的使用示例。
toolName: view_files
status: success
filePath: c:\Users\hyx\Desktop\项目\Blog Platform\frontend\src\views\Login.vue
我需要查看更多文件,寻找使用window对象方法的例子。让我检查一下src目录下的其他文件。
toolName: file_search
status: success
file_pattern: **/*.vue
让我查看App.vue文件,因为它通常是应用的入口文件,可能包含window对象方法的使用。
toolName: view_files
status: success
filePath: c:\Users\hyx\Desktop\项目\Blog Platform\frontend\src\App.vue
让我查看stores目录,因为它可能包含与本地存储相关的代码,这通常会使用window对象的方法。
toolName: view_folder
status: success
c:\Users\hyx\Desktop\项目\Blog Platform\frontend\src\stores
让我查看user.js文件,因为它可能包含与用户认证和本地存储相关的代码,这通常会使用window对象的方法。
toolName: view_files
status: success
filePath: c:\Users\hyx\Desktop\项目\Blog Platform\frontend\src\stores\user.js
让我查看theme.js文件,看看是否有更多window对象方法的使用。
toolName: view_files
status: success
filePath: c:\Users\hyx\Desktop\项目\Blog Platform\frontend\src\stores\theme.js
JavaScript 中 window 对象的方法 - 项目代码示例分析
1. window 对象概述
window 对象是 JavaScript 中全局对象的实例,代表浏览器窗口。它提供了许多方法和属性,用于操作浏览器窗口、处理用户交互、访问浏览器功能等。
2. 项目中使用的 window 对象方法
通过分析项目代码,我发现以下 window 对象方法的使用:
2.1 localStorage API
功能:提供本地存储功能,数据持久保存在浏览器中。
使用示例:
// 从 localStorage 获取数据
user: JSON.parse(localStorage.getItem('user')) || null,
token: localStorage.getItem('token') || null,
// 向 localStorage 存储数据
localStorage.setItem('user', JSON.stringify(user))
localStorage.setItem('token', token)
// 从 localStorage 删除数据
localStorage.removeItem('user')
localStorage.removeItem('token')
说明:
localStorage.getItem(key):获取指定键名的数据localStorage.setItem(key, value):存储数据到指定键名,数据必须是字符串localStorage.removeItem(key):删除指定键名的数据- 由于 localStorage 只能存储字符串,需要使用
JSON.parse()和JSON.stringify()处理对象数据
2.2 matchMedia API
功能:检测媒体查询条件是否匹配,常用于响应式设计。
使用示例:
// 检测系统是否为深色模式
isDarkMode: (state) => {
if (state.followSystem) {
return window.matchMedia('(prefers-color-scheme: dark)').matches
}
return state.themeMode === 'dark'
},
// 监听系统主题变化
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
if (this.followSystem) {
this.applyTheme()
}
})
}
说明:
window.matchMedia(mediaQueryString):返回一个 MediaQueryList 对象- MediaQueryList 对象表示媒体查询条件的匹配状态
MediaQueryList.matches:布尔值,表示媒体查询是否匹配MediaQueryList.addEventListener('change', callback):监听媒体查询状态变化
2.3 document 对象(window 的属性)
功能:代表当前文档,提供操作 DOM 的方法。
使用示例:
// 创建 DOM 元素
const confetti = document.createElement('div')
// 获取根元素
const html = document.documentElement
// 操作 DOM 类和属性
html.classList.add('dark')
html.setAttribute('data-theme', 'dark')
说明:
document.createElement(tagName):创建新的 DOM 元素document.documentElement:获取 HTML 根元素element.classList.add(className):添加 CSS 类element.setAttribute(name, value):设置元素属性
2.4 事件对象属性(间接使用 window)
功能:在事件处理函数中获取鼠标位置等信息。
使用示例:
const handleMouseMove = (event) => {
const rect = event.currentTarget.getBoundingClientRect()
mouseX.value = event.clientX - rect.left - rect.width / 2
mouseY.value = event.clientY - rect.top - rect.height / 2
}
说明:
event.clientX和event.clientY:鼠标指针相对于浏览器窗口的水平和垂直坐标- 这些属性虽然是事件对象的属性,但事件对象是由 window 对象创建和分发的
3. 其他常见的 window 对象方法
虽然项目中没有直接使用,但以下是一些常用的 window 对象方法:
| 方法 | 功能 | 示例 |
|---|---|---|
window.alert() |
显示警告对话框 | window.alert('登录成功!') |
window.confirm() |
显示确认对话框 | if (window.confirm('确定要删除吗?')) { /* 执行删除 */ } |
window.prompt() |
显示输入对话框 | const name = window.prompt('请输入您的名字:') |
window.open() |
打开新窗口 | window.open('https://example.com', '_blank') |
window.close() |
关闭当前窗口 | window.close() |
window.scrollTo() |
滚动到指定位置 | window.scrollTo(0, 0) |
window.location |
操作当前 URL | window.location.href = '/home' |
window.history |
操作浏览器历史 | window.history.back() |
window.setTimeout() |
延迟执行函数 | window.setTimeout(() => { /* 执行操作 */ }, 1000) |
window.setInterval() |
定期执行函数 | window.setInterval(() => { /* 执行操作 */ }, 1000) |
4. 代码优化建议
4.1 本地存储操作封装
当前代码:
// 读取数据
user: JSON.parse(localStorage.getItem('user')) || null,
// 存储数据
localStorage.setItem('user', JSON.stringify(user))
优化建议:
// 封装本地存储操作
const storage = {
get: (key, defaultValue = null) => {
try {
const item = localStorage.getItem(key)
return item ? JSON.parse(item) : defaultValue
} catch (error) {
console.error('Error getting from localStorage:', error)
return defaultValue
}
},
set: (key, value) => {
try {
localStorage.setItem(key, JSON.stringify(value))
} catch (error) {
console.error('Error setting to localStorage:', error)
}
},
remove: (key) => {
try {
localStorage.removeItem(key)
} catch (error) {
console.error('Error removing from localStorage:', error)
}
}
}
// 使用
user: storage.get('user'),
// ...
storage.set('user', user)
4.2 媒体查询监听优化
当前代码:
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
if (this.followSystem) {
this.applyTheme()
}
})
}
优化建议:
// 存储媒体查询对象,方便后续移除监听器
let darkModeMediaQuery = null
initTheme() {
this.applyTheme()
// 监听系统主题变化
if (window.matchMedia) {
darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
const handleThemeChange = (e) => {
if (this.followSystem) {
this.applyTheme()
}
}
darkModeMediaQuery.addEventListener('change', handleThemeChange)
// 存储清理函数
this.cleanup = () => {
if (darkModeMediaQuery) {
darkModeMediaQuery.removeEventListener('change', handleThemeChange)
}
}
}
},
// 在组件卸载时调用清理函数
// 注意:在 Pinia store 中可能需要不同的清理机制
5. 总结
window 对象是 JavaScript 中非常重要的全局对象,它提供了许多方法和属性,用于操作浏览器窗口、处理用户交互、访问浏览器功能等。在项目中,我们主要使用了以下 window 对象相关的功能:
- localStorage API:用于持久化存储用户数据和主题偏好
- matchMedia API:用于检测和监听系统主题变化
- document 对象:用于操作 DOM 元素
- 事件对象属性:用于获取鼠标位置等信息
这些方法的使用使得我们的应用能够:
- 保持用户登录状态
- 记住用户的主题偏好
- 响应系统主题变化
- 实现交互式动画效果
通过合理使用 window 对象的方法,我们可以创建更加用户友好、功能丰富的 Web 应用。
更多推荐
所有评论(0)