vue组件与复用详解

组件 (component) 是 vue.js 最强大的功能之一。组件可以扩展 html 元素,封装可重用的代码。这篇文章主要介绍了vue组件与复用,需要的朋友可以参考下

一、什么是组件

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。

二、组件用法

组件需要注册后才可以使用,注册有全局注册和局部注册两种方式。

立即学习“前端免费学习笔记(深入)”;

2.1 全局注册后,任何V ue 实例都可以使用。如:      

 

          

Vue.component('my-component',{  template: '

这里是组件的内容

'});var app1 = new Vue({  el: '#app1'});

登录后复制

 要在父实例中使用这个组件,必须要在实例创建前注册,之后就可以用<my-component>component> 的形式来使用组件了

template的DOM结构必须被一个元素包含, 如果直接写成“这里是组件的内容”, 不带“

p >”是无法渲染的。(而且最外层只能有一个根的

标签)

2.2 在Vue 实例中,使用component选项可以局部注册组件,注册后的组件只有在该实例作用域下有效。如:

    

          

var app2 = new Vue({  el: '#app2',  components:{   'my-component1': {     template: '

这里是局部注册组件的内容

'   }  }});

登录后复制

2.3 data必须是函数

除了template选项外,组件中还可以像Vue实例那样使用其他的选项,比如data 、computed 、methods等。但是在使用data时,和实例稍有区别, data 必须是函数,然后将数据return 出去。

    

          

Vue.component('my-component3',{  template: '

{{message}}

',  data: function(){    return {      message: '组件内容'    }  }});var app3 = new Vue({  el: '#app3'});

登录后复制

 一般return的对象不要引用外部的对象,因为如果return 出的对象引用了外部的一个对象, 那这个对象就是共享的, 任何一方修改都会同步。

所以一般给组件返回一个新的独立的data对象。

补充:vue-router 组件复用问题

组件系统是Vue的一个重要组成部分,它可以将一个复杂的页面抽象分解成许多小型、独立、可复用的组件,通过组合组件来组成应用程序,结合vue-router的路由功能将各个组件映射到相应的路由上,通过路由的变化来告诉Vue要在哪里渲染他们,实现各个组件、各个页面之间的跳转导航。

问题

使用vue-router切换路由时会触发组件树的更新,根据定义的路由渲染一个新的组件树,大致的切换过程是这样的:

– 停用并移除不需要的组件
– 验证切换的可行性
– 复用没有进行更新的组件
– 启用并激活新的组件

具体路由切换控制流程请参考官方文档:切换控制流水线

那vue-router是怎么判断某一个组件可以复用的呢? 我们看一下下面这条路由配置:

{  path: 'post/:postId',  name: 'post',  component: resolve => require(['./components/Post.vue'],resolve)}

登录后复制

这是通过文章ID加载对应文章页面的路由,第一次访问时,Post.vue这个组件会被渲染到组件树中,mounted安装组件时通过文章ID获取文章内容展示到页面上,当我们访问另一篇文章时,路由参数:postId发生改变,按照我们的预期应该会展示新文章的内容,但是事与愿违。

我们看到的还是之前的文章,虽然路由参数已发生更改,但是vue-router会以为你访问的是Post.vue这个组件,由于之前已经渲染过该组件,所以会直接复用之前的组件,并且不会执行组件中的任何操作包括mounted之类的生命周期函数。

所以我们最终看到的还是原来组件的内容。

那要怎么才能实现我们期望的效果呢?下面介绍一种有效的解决方法

解决方法

我们可以使用watch侦听器来监听路由的变化情况,根据路由参数的变化来响应相应的数据,具体实现过程是这样的:

定义数据获取方法

首先定义一个获取文章的方法,根据文章ID从后台获取对应的文章信息。

methods: {  getPost(postId) {    this.$http.get(`/post/get_post/${postId}`).then((response) => {      if(response.data.code === 0){        this.post = response.data.post;      }    });  }}

登录后复制

监听路由

接着是在路由切换的时候判断目标组件是否是Post.vue组件,这里可以根据定义的路由名称name实现,如果是,我们就可以从路由信息中获取目标文章ID来更新组件内容。

watch: {  '$route' (to, from) {    if(to.name === 'post'){      this.getPost(to.params.postId);    }  }}

登录后复制

组件初始化

这里需要注意的是,当组件首次被挂载到组件树上时,对路由的监听是无效的,这时我们需要在生命周期钩子mounted对组件进行初始化工作:

mounted() {  this.getPost(this.$route.params.postId);}

登录后复制

写在最后

通过上面的方法就可以实现组件内容随路由参数的变化而更新了,有效解决了vue-router组件复用导致路由参数失效的问题。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

JavaScript生成指定范围的时间列表

基于webpack.config.js 参数详解

nodejs基于express实现文件上传的方法

以上就是vue组件与复用详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2756799.html

(0)
上一篇 2025年3月8日 07:44:28
下一篇 2025年3月8日 07:44:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样使用angular4在多个组件中数据通信

    这次给大家带来怎样使用angular4在多个组件中数据通信,使用angular4在多个组件中数据通信的注意事项有哪些,下面就是实战案例,一起来看一下。 应用场景,不同组件中操作统一组数据,不论哪个组件对数据进行了操作,其他组件中立马看到效果…

    2025年3月8日
    200
  • 详解vue表单

    大家可以用 v-model 指令在表单控件元素上创建双向数据绑定。这篇文章主要介绍了vue表单详解,需要的朋友可以参考下 一、基本用法 你可以用 v-model 指令在表单 及 元素上创建双向数据绑定。 但 v-model 本质上不过是语法…

    编程技术 2025年3月8日
    200
  • 怎样使用vue文件树组件

    这次给大家带来怎样使用vue文件树组件,使用vue文件树组件的注意事项有哪些,下面就是实战案例,一起来看一下。 本文主要是分析vue官方仓库里的文件树组件[vue github] demo可以查看 https://codepen.io/sh…

    编程技术 2025年3月8日
    200
  • 如何使用vue全局与局部组件

    这次给大家带来如何使用vue全局与局部组件,使用vue全局与局部组件的注意事项有哪些,下面就是实战案例,一起来看一下。 main.js入口文件的一些常用配置, 在入口文件上定义的public.vue为全局组件,在这里用的是pug模版 .wr…

    编程技术 2025年3月8日
    200
  • 怎样操作vue父组件调用子组件

    这次给大家带来怎样操作vue父组件调用子组件,使用vue父组件调用子组件的注意事项有哪些,下面就是实战案例,一起来看一下。 情景:   父组件中引入上传附件的子组件:点击组件可以分别上传对应要求的图片,子组件内部循环可创建多个模块.   父…

    2025年3月8日
    200
  • JS的new()底层逻辑详解

    这次给大家带来JS的new()底层逻辑详解,JS的new()使用注意事项有哪些,下面就是实战案例,一起来看一下。 前言 和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存…

    2025年3月8日
    200
  • 怎样利用Vue自定义动态组件

    这次给大家带来怎样利用Vue自定义动态组件,利用Vue自定义动态组件的注意事项有哪些,下面就是实战案例,一起来看一下。 现在基于vue的UI组件库有很多,比如iview,element-ui等。但有时候这些组件库满足不了我们的开发需求,这时…

    2025年3月8日 编程技术
    200
  • angular2模块和共享模块详解

    这篇文章主要介绍了angular2模块和共享模块详解,现在分享给大家,也给大家做个参考。 创建模块,用到了共享模块PostSharedModule,共享模块里面包含了2个公用的模块:文章管理模块和评论管理模块 1,创建一个模块testmod…

    编程技术 2025年3月8日
    200
  • 怎样使用React高阶组件

    这次给大家带来怎样使用React高阶组件,使用React高阶组件的注意事项有哪些,下面就是实战案例,一起来看一下。 前段时间在工作中写Hybrid页面时遇到了这样的一个场景,公司需要一系列的活动组件,在每个组件注册的时候都需要调用App端提…

    2025年3月8日
    200
  • 怎样正确使用vue组件复用功能

    这次给大家带来怎样正确使用vue组件复用功能,正确使用vue组件复用功能的注意事项有哪些,下面就是实战案例,一起来看一下。 一、什么是组件 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论