96SEO 2026-08-13 02:04 0
ref可以定义任何数据类型的变量,在 JS 中需要通过 .value 获取值;在模板中会自动解包,reactive只能定义对象类型的数据,解构后会丢失响应式。watch侦听器,用法示例:
watch => {
reset;按理说,getNewsList;}),老实说,
痛点:如果页面没有传入这三个参数。控制台会报错,
改为 getter 的形式可以避免警告。但也会导致 watch 不触发:

watch => startDate,=> endDate,=> categoryList],=> {
reset;按理说,getNewsList;}),
refref返回内部值,否则返回参数本身。ref 或 getter 转换为 refunref,同时规范化 getter 函数。ref
Pain Point:include/exclude 属性是基于组件的 Name 匹配,而不是路由的 name。重复使用同名组件(如多个 /src/views/index.vue) 时匹配失败。
解决办法:
Name
{
path这方面,'/newsList/:newsType',name: 'newsList',component: => import,meta: {
requiresAuth: true。needCache: true,isBackFromDetail: false,},}
defineOptions({
从name来看,'newsList',beforeRouteEnter {
to.meta.isBackFromDetail = from.name === 'newsDetail';},}),按理说,
Pain Point:SFC 中的 setup 无法直接使用路由守卫。需要放在 script 块或使用 defineOptions 包装。
onActivated => {
// 非“从详情返回”时重新请求数据
if {
reset;getNewsList,}
// 重置标记,防止下次误判
route.meta.isBackFromDetail = false;}),老实说,
*缺点*:当页面状态复杂时需要手动清空大量数据。易产生 bug,
Pain Point:No‑Cache‑When‑From‑Home but Keep Cache on Browser Back/Forward.
// src/stores/cached-view.ts
import { defineStore } from 'pinia';不过,export const useCachedViewStore = defineStore => {
const cachedViewList = ref;
function addCachedView { if ) { cachedViewList.value.push;} }
function delCachedView { const idx = cachedViewList.value.indexOf;if cachedViewList.value.splice;return idx> -1;}
async function delCacheEntry { if ) { await nextTick;addCachedView;} }
return { cachedViewList。addCachedView,delCachedView,delCacheEntry };}),
router.beforeEach => { const { addCachedView } = useCachedViewStore;addCachedView;}),
defineOptions({ 从name来看,'newsList'。beforeRouteEnter { if { const { delCacheEntry } = useCachedViewStore;delCacheEntry;} },}),
Pain Point:If you delete cache in a global navigation guard it also removes history‑back caches. The workaround is to clear cache only on explicit navigation from Home:
// 首页点击入口前手动清除
const { delCacheEntry } = useCachedViewStore;const handleGridClick = newsType => {
delCacheEntry;router.push,};
export default defineConfig({
base的观点是。'/my-sub-path/',plugins:,});
Pain Point:`params` 参数顺序敏感且可选参数多时容易出现错位;切换页面后浏览器前进/后退导致获取不到正确值。说起来,
# 推荐使用 `query` 参数:
// 路由定义 { path的观点是,'/newsList'。name: 'newsList',component: => import }
// 页面获取 const route = useRoute;其实,const newsType = Number;// 手动转型
Pain Point:`redirect` 本身带有 query 时拼接后的 `?` 会导致两层 query 难以解析;而不带 query 时`?` 紧跟在方法后一样需要特殊处理。
"环境变量" 与 "模式" 是两个概念。不同模式可以对应不同的 .env 文件,如 .env.development、.env.test、.env.production。通过 读取对应值。
json
// package.json scripts 示例
{
"scripts": {
从"dev"来看,"vite","dev:test": "vite --mode test","build": "vite build","build:test": "vite build --mode test"。"preview": "vite preview"
}
}
"store" 本质上是一个经过 reactive 包装的对象。若在 setup 中直接解构,会失去响应式:
// ❌ 错误写法。会导致页面不更新 import { useNewsStore } from '@/stores/news';const { newsType,getNewTypes } = useNewsStore;getNewTypes,// UI 不会响应变化 The correct way is to keep store object intact or use **storeToRefs**:
// ✅ 正确写法 import { storeToRefs } from 'pinia';const newsStore = useNewsStore;const { newsType } = storeToRefs;// 响应式 ref const { getNewTypes } = newsStore;// action 可直接解构 // 或者直接使用 computed 包装属性 const newsType = computed => newsStore.newsType);Pain Point: 当你把整个 store 解构后再调用 action。action 本身仍然可用,但关联状态已经失去响应式,导致 UI 不更新。 Shrink or Share State?
从*思考*来看,哪些状态应该放进 Pinia?如果仅在少数页面间共享且逻辑简单,可以抽象成自定义 Hook;但若涉及跨页面、持久化或需要统一管理,则推荐放进 Pinia。以免出现“多处副本”导致状态不一致的问题。
Bizarre Bug – List API 被意外触发 🚩 ️️️️️️️️️️
A list page navigates to detail page. The hook that watches input parameters for list still fires after navigation because its effect scope wasn't disposed.
Pain Point : watch 副作用没有在离开页面时销毁。可以尝试把 watch 包裹在 **effectScope** 中,在 onUnmounted 时手动 stop。老实说,js import { effectScope } from '@vue/reactivity';onMounted => { const scope = effectScope;scope.run => { watch;}),onUnmounted => scope.stop);}),Vant4 实际坑点与常用方法
- Field 输入框数值类型问题 :type 为 number 时 v-model 返回 string。即使加了 number 修饰符,formatter 接收仍是 string。只有提交阶段才会转换成 number。其实,校验 validator 一样接收 string。需要自行转型或在 rules 中处理。
- Dialog 默认行为冲突 :confirm 按钮点击后会自动关闭弹窗,即便表单未校验通过。说到解决办法,
- 使用 before-close 阻止默认关闭;或者自定义底部按钮,通过 click 手动调用 close。不过,
- 宽度默认320px。如果全局懒加载路由导致样式覆盖异常,请改为路由懒加载方式加载首页组件,以确保 CSS 正确注入。
... ... ... ...公司微信内部应用
如何接入公司微信 SDK
Pain Point : SDK 必须在每个需要调用它的页面先进行注册,否则读取到的 URL 与实际不符。**方法**这方面,1️⃣ 在对应页面生命周期最早阶段调用: js import wx from '@jssdk/wechat';// 假设已安装官方 SDK onMounted => { wx.config;}),附件下载与预览
Pain Point :iOS/Android Webview 下 `window.open` 与跨域链接无法打开。只能走 SDK 或后台代理下载。
场景 实现方式 注意事项 移动端预览 调用 wx.previewFile必须先注册 SDK;网络异常需提示使用者 “下载失败,请检查网络”。其实, PC端下载 使用 下载附件或window.open跨域资源需服务器设置 CORS。否则无法打开,老实说,
TODO 列表
- VueUse 换肤 – 利用
prefers-color-scheme媒体特性实现暗黑模式切换,并持久化使用者选择到 localStorage;- 主题 CSS Variable – 定义
{ --bg:#000;--text:#fff,}并通过动态切换;- 全局暗色类 –
document.documentElement.classList.toggle;.
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback