vue3之声明式和编程式导航详解

 更新时间:2024年06月07日 11:11:41   作者:**之火  
这篇文章主要介绍了vue3之声明式和编程式导航,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue3声明式和编程式导航

在组件内部,可以使用 router 属性访问路由,例如 this.router 属性访问路由,例如 this. router属性访问路由,例如this.router.push(…)。

如果使用组合式 API,你可以通过调用 useRouter() 来访问路由器,导入后赋值给变量就行了,如:const router = useRouter();

声明式编程式
<router-link :to=“…”>router.push(…)
<router-link :to=“…” replace>替换路由:router.replace(…)
替换路由或:router.push({ path: ‘/home’, replace: true }),相当于router.replace({ path: ‘/home’ })

编程式router.push(…) 多种写法

// 字符串路径
router.push('/users/eduardo')

// 带有路径的对象
router.push({ path: '/users/eduardo' })

// 除了 path 之外,你还可以为任何路由提供 name
// 命名的路由,并加上参数,让路由建立 url
// 如果可能的话,使用 `name` 和 `params` 从自动 URL 编码中获益
// 路由将导航到路径 /user/erina
// 所有路由的命名都必须是唯一的。如果为多条路由添加相同的命名,路由器只会保留最后那一条。
router.push({ name: 'user', params: { username: 'eduardo' } })
<router-link :to="{ name: 'user', params: { username: 'erina' }}">
  User
</router-link>

// 带查询参数,结果是 /register?plan=private
router.push({ path: '/register', query: { plan: 'private' } })

// 带 hash,结果是 /about#team
router.push({ path: '/about', hash: '#team' })

// `params` 不能与 `path` 一起使用,如果提供了 path,params 会被忽略
router.push({ path: '/user', params: { username } }) // -> /user

router.push 和所有其他导航方法都会返回一个 Promise,让我们可以等到导航完成后才知道是成功还是失败。

导航横跨历史

// 向前移动一条记录,与 router.forward() 相同
router.go(1)

// 返回一条记录,与 router.back() 相同
router.go(-1)

// 前进 3 条记录
router.go(3)

// 如果没有那么多记录,静默失败
router.go(-100)
router.go(100)

router.push、router.replace 和 router.go 是window.history.pushState,window.history.replaceState 和 window.history.go 的翻版,它们模仿了 window.history 的 API。

为什么vue3中声明响应式一般用const

为什么Vue3中声明响应式对象一般用const。如

import { reactive } from 'vue'
const state = reactive({ count: 0 })

因为 Vue 的响应式系统是通过属性访问进行追踪的(响应式数据对象的属性的副作用函数的订阅),因此我们必须始终保持对该响应式对象的相同引用。

副作用订阅将被存储在一个全局的 WeakMap<target, Map<key, Set>> 数据结构中。

防止响应式被替换丢失链接

let state = reactive({ count: 0 })

// 上面的引用 ({ count: 0 }) 将不再被追踪(响应性连接已丢失!)
state = reactive({ count: 1 })

而如果使用const进行声明的话,state不允许被重新赋值。可以用声明变量上方式响应式链接丢失。防止原响应式对象在WeakMap中失去。

当我们将响应式对象的属性****赋值给变量解构至本地变量时,或是将该属性传入一个函数时,我们会失去响应性,即赋值或结构到的变量或参数函数不会引起响应式数据的变化,原响应式数据的变化也不会引起本地变量的变化。

const state = reactive({ count: 0 })

// n 是一个局部变量,同 state.count
// 失去响应性连接
let n = state.count
// 不影响原始的 state
n++

// count 也和 state.count 失去了响应性连接
let { count } = state
// 不会影响原始的 state
count++

// 该函数接收一个普通数字,并且
// 将无法跟踪 state.count 的变化
callSomeFunction(state.count)

使用ref维持响应式

Vue3使用ref来给所有变量声明响应式。通过ref.value来访问数据对象,ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象:

const count = ref(0)

console.log(count) // { value: 0 }
console.log(count.value) // 0

count.value++
console.log(count.value) // 1

const objectRef = ref({ count: 0 })
// 这是响应式的替换
objectRef.value = { count: 1 }

ref对象的value也是响应式的。当ref传入的参数数据是复合数据类型时,会使用reactive自动转化value属性。

简言之,ref() 让我们能创造一种对任意值的 “引用”,并能够在不丢失响应性的前提下传递这些引用。这个功能很重要,因为它经常用于将逻辑提取到 组合函数 中。

ref 被传递给函数或是从一般对象上被解构时,ref不会丢失响应性

即可以传递响应式数据进行操作。如函数式编程。

const obj = {
  foo: ref(1),
  bar: ref(2)
}

// 该函数接收一个 ref
// 需要通过 .value 取值
// 但它会保持响应性
callSomeFunction(obj.foo)

// 仍然是响应式的
const { foo, bar } = obj

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决vue bus.$emit触发第一次$on监听不到问题

    解决vue bus.$emit触发第一次$on监听不到问题

    这篇文章主要介绍了解决vue bus.$emit触发第一次$on监听不到问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue 解决移动端弹出键盘导致页面fixed布局错乱的问题

    vue 解决移动端弹出键盘导致页面fixed布局错乱的问题

    今天小编就为大家分享一篇vue 解决移动端弹出键盘导致页面fixed布局错乱的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue3中的存储库pinia概述

    Vue3中的存储库pinia概述

    Pinia是Vue3的状态管理库,替代Vuex,支持跨组件共享状态、修改数据及持久化存储,通过pinia-plugin-persist插件实现数据持久化,需在main.ts和store配置中引入,本文给大家介绍Vue3中的存储库pinia,感兴趣的朋友一起看看吧
    2025-06-06
  • 关于Vue.js一些问题和思考学习笔记(1)

    关于Vue.js一些问题和思考学习笔记(1)

    这篇文章主要为大家分享了关于Vue.js一些问题和思考的学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 使用vite兼容低端浏览器配置

    使用vite兼容低端浏览器配置

    这篇文章主要介绍了使用vite兼容低端浏览器配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Vue中的table表单切换实现效果

    Vue中的table表单切换实现效果

    这篇文章主要介绍了Vue中的table表单切换实现效果,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue中使用Tinymce的示例代码

    vue中使用Tinymce的示例代码

    这篇文章主要介绍了vue中使用Tinymce的示例,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • vue-cli下的vuex的简单Demo图解(实现加1减1操作)

    vue-cli下的vuex的简单Demo图解(实现加1减1操作)

    这篇文章主要介绍了vue-cli下的vuex的简单Demo(实现加1减1操作),本文图文并茂给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • vue ajax 拦截原理与实现方法示例

    vue ajax 拦截原理与实现方法示例

    这篇文章主要介绍了vue ajax 拦截原理与实现方法,结合实例形式分析了vue.js基于ajax拦截实现无刷新登录的相关原理与操作技巧,需要的朋友可以参考下
    2019-11-11
  • vue3 vite pinia配置动态路由、解决刷新页面路由消失的问题

    vue3 vite pinia配置动态路由、解决刷新页面路由消失的问题

    这篇文章主要介绍了vue3 vite pinia配置动态路由、解决刷新页面路由消失的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论