Vue踩坑之路 | 父子组件传值的几种方法

在实际的开发过程中,真的是一步一个坑, 总结了下,其实是两方面的原因:

  • 自己基础不牢固,js写的不熟练
  • vue的文档没有读透,很多东西模棱两可

在开发过程中, 涉及到了一个预览功能, 需要把父组件输入的值传递到子组件去展示,刚开始怎么都不理解, 把路由传值和注册组件混在了一起使用,导致一直传值失败。 后经过小伙伴的指导,才理解了几种传值方法的差异,接下来就记录一下吧。

先来说一下我的需求, 在一个资讯发布界面,输入的内容需要在下个界面显示出来, 类似预览功能:

5670606-7d3a80e2247a6990.png
5670606-8624472a383e748c.png

方法一:router.push(location, onComplete?, onAbort?)

在Vue实例内部, 你可以通过$router访问路由实例。因此你可以调用this.$router.push

想要导航到不同的URL,则使用router.push方法, 这个方法会向history栈添加一个新的记录,当用户点击浏览器后退按钮时,则回到之前的URL。

当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 <router-link :to="..."> 等同于调用 router.push(...)。

声明式 编程式
<router-link :to="..."> router.push(...)

该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:

// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})

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

注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:

const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

下面我们来看具体代码里怎么实现:

  • 先来看routers.js文件中的实现:(在这里我们定义了路由的跳转, 定义了参数和命名)
5670606-f67ddecdeaf604d2.png
routers.js
  • 父组件中view的绑定, 以及事件的绑定处理:
5670606-e8579c0a5849ed6b.png

这里在进行事件处理时,一定要注意:想params生效,就要用name(用别名指向到我们想跳转的url)

5670606-adff0927ccb38926.png
  • 子组件的接收处理:
    数据绑定最常见的形式:使用{{}}标签进行文本插值,{{}}标签将会被替代为对应数据的属性的值。只要绑定的数据属性发生了改变,插值处的内容都会更新。
5670606-7f95de789f0175b3.png

方法二:Storage对象存储

Storage的实例与其他对象类似,有如下方法:

clear(): 删除所有值;Firefox中没有实现 。
getItem(name):根据指定的名字name获取对应的值。
key(index):获得index位置处的值的名字。
removeItem(name):删除由name指定的名值对儿。
setItem(name, value):为指定的name设置一个对应的值。

其中,getItem()、removeItem()和setItem()方法可以直接调用。

Storage的实例:sessionStorage对象和localStorage对象

sessionStorage :用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。 存储在sessionStorage中的数据可以跨越页面刷新而存在,同时如果浏览器支持,浏览器崩溃并重启之后依然可用(Firefox和WebKit都支持,IE则不行)。

localStorage:如果不使用 removeItem()或者 delete 删除,或者用户未清除浏览器缓存,存储在localStorage属性中的数据会一直保留在磁盘上。localStorage非常适合在客户端存储文档或者长期保存用户偏好设置。

下面进行具体的代码演示:

  • 首先依旧是绑定,但是我们要用到<router-link :to="...">去进行组件跳转:
5670606-71f150436899d873.png
  • 获取输入的值进行临时保存:
5670606-12618d829d45ae10.png
  • 子组件从sessionStorage对象中取值:
5670606-db042ad63943b51e.png

方法三:组件间通信

  1. 父组件向子组件传参:
    简单来说, 就是在父组件引入子组件并注册,然后使用props向子组件传参,子组件进行接收。

先上两张小伙伴给我讲解的图:

5670606-bf9e4af596273067.png
5670606-d18174c5764eedfd.png
  1. 子组件向父组件传参:
    由于props是单向绑定的,所以这里并不推荐使用,而是使用emit来向父组件通信。

3.非父子组件通信:
非父子通信可以用个中间实例来进行传递,比如你新建vue项目出来的app实例,或者自己创建一个空的vue实例作为通信媒介。

对于方法三, 我这会还理解的不是很深刻, 正在继续啃vue文档中, 所以这篇文章就先到这里吧~~

5670606-f6d3b48b2a7da156.png

猜你喜欢

转载自blog.csdn.net/weixin_34253126/article/details/87632917
今日推荐