前端项目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.clientXevent.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 对象相关的功能:

  1. localStorage API:用于持久化存储用户数据和主题偏好
  2. matchMedia API:用于检测和监听系统主题变化
  3. document 对象:用于操作 DOM 元素
  4. 事件对象属性:用于获取鼠标位置等信息

这些方法的使用使得我们的应用能够:

  • 保持用户登录状态
  • 记住用户的主题偏好
  • 响应系统主题变化
  • 实现交互式动画效果

通过合理使用 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 知识点涵盖了现代前端开发的核心内容,包括:

  1. Vue 3 Composition API:使用 <script setup>refonMounted
  2. 异步编程async/awaittry/catch
  3. 函数式编程:箭头函数、纯函数
  4. 数据处理:对象解构、数组操作、日期处理
  5. 模块化开发:ES6 模块导入导出
  6. 响应式设计:CSS 变量、媒体查询
  7. 组件化开发:Vue 组件、事件处理
  8. API 集成:异步 API 调用、错误处理
  9. 状态管理:组件内状态、全局状态
  10. 性能优化:组件懒加载、计算属性

这些知识点构成了现代前端开发的基础,掌握它们对于构建高质量的前端应用至关重要。

我需要先了解项目的前端结构,然后查看代码中使用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.clientXevent.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 对象相关的功能:

  1. localStorage API:用于持久化存储用户数据和主题偏好
  2. matchMedia API:用于检测和监听系统主题变化
  3. document 对象:用于操作 DOM 元素
  4. 事件对象属性:用于获取鼠标位置等信息

这些方法的使用使得我们的应用能够:

  • 保持用户登录状态
  • 记住用户的主题偏好
  • 响应系统主题变化
  • 实现交互式动画效果

通过合理使用 window 对象的方法,我们可以创建更加用户友好、功能丰富的 Web 应用。

更多推荐