Vue全家桶之组件化开发

作者 | Jeskson

掘金 | https://juejin.im/user/5a16e1f3f265da43128096cb

学习组件化开发,首先掌握组件化的开发思想,组件的注册方式,组件间的数据交互方式,组件插槽的用法,vue调式工具的用法,组件的方式来实现业务逻辑功能。

组件化开发思想,组件注册,组件调式,组件间的数据交互,组件插槽

组件化规范,就是多的可能性重用

全局组件注册语法

Vue.component(组件名称, {
 data: 组件数据,
 template: 组件模板内容
})
// 定义一个名为button-counter的新组件
Vue.component('button-counter', {
 data: function() {
  return {
   count: 0
  }
 },
 template: '<button v-on:click="count++">点击了{{count}}次</button>
})

组件的用法

<div id="app">
 <button-counter></button-counter>
</div>
<button-counter><button-counter>
<button-counter><button-counter>

Vue.component('button-counter', {
 data: function() {
  return {
   count: 0
  }
 },
 template: '<button @click="handle">点击了{{count}}</button>'
 methods: {
  handle: function(){
   this.count += 2;
  }
 }
})
var vm = new Vue({
 el: '#app',
 data: {
 }
});

组件注册时

data必须是一个函数,组件模板内容必须是单个跟元素

template: `
 <div>
  <button @click="handle">点击{{count}}次</button>
  <button>da</button>
 </div>
`,

组件命名方式

// 短橫线方式
Vue.component('my-component',{/*...*/})

// 驼峰方式
Vue.component('MyComponent',{/*...*/}}

局部组件注册

var ComponentA = { /*...*/ }
var ComponentB = { /*...*/ }
var ComponentC = { /*...*/ }

new Vue({
 el: '#app',
 components: {
  'component-a': ComponentA,
  'component-b': ComponentB,
  'component-c': ComponentC,
 }
})

vue调式工具的用法

Make sure you are using Node 6+ and NPM 3+

  • Clone this repo
  • npm install (Or yarn install if you are using yarn as the package manager)
  • npm run bulid
  • Open Chrome extension page
  • Check ‘developer mode‘
  • Click "load unpacked extension", and choose shells/chrome.

Hacking

  • Clone this repo
  • npm install
  • npm run dev
  • A plain shell with a test app will be available at localhost: 8100.

调式工具的安装

第一步,克隆仓库,第二步,安装依赖包,第三步,构建,第四步,打开Chrome扩展页面,第五步,选中开发者模式,第六步,加载已解压的扩展,选择shells/chrome。

组件间数据交互

父组件向子组件传值

组件内部通过props接收传递过来的值

Vue.component('dada-item', {
 props: ['title'], // 用于接收父组件接收过来的数据
 template: '<div>{{title}}</div>'
})

父组件通过属性的方式将值传递给子组件

<dada-item title="来自父组件的数据"></dada-item>
// 静态

<dada-item :title="title"></dada-item>
// 动态的进行属性的绑定

代码示例:

<dada-item title="来自父组件的值"></dada-item>
<dada-item :title="ptitle"></dada-item>

//父组件向子组件传递值
Vue.component('dada-item', {
 // 子组件接收父组件
 // title属性
 props: ['title'],
 data: function() {
  return {
   msg: '子组件的数据'
  }
 },
 template: '<div>{{msg+ "..." + title}}</div>'
});
var vm = new Vue({
 el: '#app',
 data: {
  pmsg: '父组件中内容',
  ptitle: '动态',
 }
});

props属性名的规则

在props中使用驼峰的形式,则在模板中需要使用短橫线的形式

字符串形式的模板中没有这个限制

Vue.component('dada-item', {
 // 在JavaScript中驼峰式的
 props: ['daTitle'],
 template: '<div>{{title}}</div>'
})

// 在html中是短横线方式的
<dada-item da-title="dada"><dada-item>
<div id="app">
 <div>{{pmsg}}</div>
 <menu-item :menu-title="ptitle"></menu-item>
 </div>
</div>

// 父组件向子组件传值-属性名
Vue.component('third-com', {
 props: ['testTitle'],
 template: '<div>{{testTitle}}</div>'
});
Vue.component('menu-item', {
 props:['menuTitle'],
 template: '<div>{{menuTitle}}<third-com testTit="hello"></third-com></div>'
});

props属性值的类型

字符串类型 string
数值类型 number
布尔值类型 boolean
数组类型 array
对象 object

// 字符串形式
<div id="app">
 <div>{{pmsg}}</div>
 <menu-item :pstr="pstr"></menu-item>
</div>

<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
// 父组件向子组件传递-props属性名类型
Vue.component('menu-item',{
 props: ['pstr'],
 template: `
 <div>
 <div>{{pstr}}</div>
 </div>
 `
});
var vm = new Vue({
el: '#app',
data: {
 msg: "父组件内容",
 pstr: 'hello'
 }
});
</script>
// 数字传值
<dada-item :pstr='pstr' :pN='11'></dada-item>

// 父组件向子组件传值-props属性名类型

Vue.component('dada-item', {
 props: ['pstr', 'pN'],
 template: `
 <div>
  <div>{{pstr}}</div>
  <div>{{pN}}</div>
 </div>
`
});
 var vm = new Vue({
  el: '#app',
  data: {
   pmsg: '父组件'
   pstr: 'dada'
  }
 });

子组件向父组件传值

<dada-item :parr="parr"></dada-item>

// 子组件向父组件传值
Vue.component('dada-item', {
 props: ['parr'],
 template: `
 <div>
  <ul>
   <li :key="index" v-for="(item,index) in parr">
   {{item}}
   </li>
  </ul>
  <button @click='parr.push("dada")'>点击</button>
 </div>
 `
 });
 var vm = new Vue({
  el: '#app',
  data: {
   pmsg: '父组件',
   parr: ['da1','da2','da3']
  }
 }];

子组件向父组件传值,子组件通过自定义事件向父组件传递信息

<button v-on:click='$emit("事件名", 值)'>dada</button>

父组件监听子组件事件

<dada-item v-on:事件名='size += 1'><dada-item>

非父子组件传值

兄弟组件之间的交互

var event = new Vue()

事件中心

监听事件和事件的销毁

event.$on('自定义事件的名称',事件函数)
监听事件,第一个参数,自定义监听事件的名称,第二个为事件函数

event.$off('自定义事件的名称')
// 销毁事件

触发事件
event.$emit('自定义事件的名称', id)
mounted: function() {
 // 监听事件
 eventhub.$on('da1', (val)=>{
  this.num += val;
 });
}

mounted: function() {
 // 监听事件
 eventhub.$on('da2', (val)=>{
  this.num += val;
 });
}

组件插槽

父组件向子组件传递数据,父组件传给子组件

// 父组件
<dada-item> dada </dada-item>
这里的dada 没有插槽是显示不了的

// 子组件
插槽
<slot></slot>

插槽的位置位于子组件的模板中

// 插槽的位置
Vue.component('dada-box', {
 template: `
 <div class="dada-item'>
  <div>da</div>
  <slot></slot>//显示的位置
 </div>
 `
})

// 显示内容,插槽
<dada-box> dada hello </dada-box>

重点,具名插槽用法,有名字的插槽

<div class="dada">
 <header>
  <slot name="header"></slot>
 </header>

 <main>
  <slot></slot>
 </main>

 <footer>
  <slot name="footer"></slot>
 </footer>
</div>

插槽内容

<dada-layout>
 <h1 slot="header"> 标题</h1>
 <p>你让开,达达来了</p>
 <h1 slot="footer"> 底部</h1>
</dada-layout>
<template slot="header">
<p>标题1</p>
<p>标题2</p>
</template>
// 放置更多内容

作用域插槽

<dada-list :list="list"></dada-list>

Vue.component('dada-list', {
 props: ['list'],
 template: `
 <div>
 <li :key='item.id' v-for="item in list>{{item.name}}</li>
 </div>
 `
});

var vm = new Vue({
 el: '#app',
 data: {
  list: [{
   id:1,
   name: 'dada'
  },{
  ...
  }
  ]
 }

插槽的定义,子组件中

<ul>
<li v-for="item in list" v-bind:key="item.id">
<slot v-bind:item="item">
 {{item.name}}
</slot>
</li>
</ul>
// 插槽内容
<dada-list v-bind:list="ist">
<template slot-scope="slotProps">

</template>
</dada-list>
<div id="app">
<dada-list :list="list">
 <template slot-scope="slotProps">
  {{slotPrOps.info.name}}
 </template>
</dada-list>
</div>

购物车功能的步骤,实现整体布局和样式,划分功能组件,组合所有子组件形成整体结构,逐个实现各个组件功能,标题组件,列表组件,结算组件。

最后

欢迎加我微信(xiaoda0423),拉你进技术群,长期交流学习...
欢迎关注「达达前端」,认真学前端,做个有专业的技术人...

在博客平台里,未来的路还很长,也希望自己以后的文章大家能多多支持,多多批评指正,我们一起进步,一起走花路。

非常感谢读者能看到这里,如果这个文章写得还不错,觉得「达达」我有点东西的话,觉得我能够坚持的学习,觉得此人可以交朋友的话, 求点赞?? 求关注?? 求分享?? 对暖男我来说真的

非常有用!!!

?? 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

作者Info:

【作者】:Jeskson
【原创公众号】:达达前端小酒馆。
【福利】:公众号回复 “资料” 送自学资料大礼包(进群分享,想要啥就说哈,看我有没有)!
【转载说明】:转载请说明出处,谢谢合作!~

大前端开发,定位前端开发技术栈博客,PHP后台知识点,web全栈技术领域,数据结构与算法、网络原理等通俗易懂的呈现给小伙伴。谢谢支持,承蒙厚爱!!!



若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。


请点赞!因为你们的赞同/鼓励是我写作的最大动力!

欢迎关注达达的CSDN!

这是一个有质量,有态度的博客

原文地址:https://www.cnblogs.com/dashucoding/p/12154622.html

时间: 2024-11-03 22:15:32

Vue全家桶之组件化开发的相关文章

Vue全家桶+Egg从0开发大型项目(一)搭建项目

前言 因为要开发本科毕设,做一个校友交流平台,正好想记录下整个开发过程,同时也分享给各位.当然那些需求调研的,前期设计的就省略啦. 项目大概是一个全栈的项目,使用的IDE是vscode(期间涉及一些插件.配置推荐),大概的项目技术栈: vue + vue-router + vuex + vue-i18n + element-ui + egg + sequelize 前端就用vue-cli3来搭建,后端就用egg-init来搭建,比较简单,官方文档也比较详细. 项目技术栈 前端: 前端MVVM框架

vue(7)—— 组件化开发 — webpack(1)

引子 在研究完前面的vue开发后,其实已经可以自己开发点东西了,靠前面的指令集,组件,还有vue-router,还有异步请求这些知识点,是完全可以开发出来的,完全可以达到时下前后端分离的效果. 但是,你在开发的过程当中,可能会遇到很多问题,而你只能用很低端的手段来解决问题,也可能在开发中,会遇到大量重复代码,而且还没有个很好的解决办法,并且在以后实际开发中,并不会像前面那样,一个html页面就搞定所有了,绝对不会的,肯定会有很多个文件,各种库,各种包之类的,这里倒过来,那里倒过去,哪个放前面,哪

Vue入门五、组件化开发

创建组件的两种方式: 1.局部组件声明.注册和使用: 方法一(推荐). <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script type="text/javascript" src=&quo

前端框架Vue自学之Vue组件化开发(三)

终极目标:掌握和使用Vue(全家桶:Core+Vue-router+Vuex) 本博客目的:记录Vue学习的进度和心得(Vue组件化开发) 内容:通过官网说明,掌握Vue组件化开发. 正文: Vue组件化开发 一.认识组件化 原文地址:https://www.cnblogs.com/xinkuiwu/p/12037281.html

前端工程师晋升课程 Vue全家桶+SSR+Koa2全栈开发美团网

第1章 课程导学这门课主讲以Vue SSR+Koa2全栈技术为目标,最终实现美团网项目.本章节旨在告诉大家我们会用到哪些技能.教学方法.课程内容分布.学习方法等.备注:我们会涉及Vue2.5.Nuxt.Koa2.element-ui.Mongodb等 1-1 课程导学第2章 Vue基础知识整个SSR部分都是用的Vue框架,需要给初级用户讲解Vue的基础语法,不会让他们在学习实战的时候感到迷茫,这个章节会通过vue-cli搭建一个简单的demo,让大家快速的掌握Vue的基础应用,即使他没有学习过.

Vue全家桶实战 从零独立开发企业级电商系统

Vue全家桶实战 从零独立开发企业级电商系统(免费升级Vue3.0)现阶段,电商系统随处可见,具有很大市场潜力:同时因为商城系统复杂,涉及到丰富的知识点,如果能进行电商系统的开发,其它各类型的前端系统也能掌握.本课程以Vue全家桶作为主要的技术体系,模拟小米商城,带大家从0开始开发网页和交互功能.你能进行完整的项目架构.体会页面开发的全流程.学习丰富的技术栈和各类组件知识,还能了解Git.动画.开发调试等方面的知识.同时项目本身具有很强的实用性,稍作修改,便能"为我所用".相信此课程能

Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结

本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 项目上线有一段时间了,一个基于webpack+vue+ES6的手机端多页面应用.其实说是多页面应用,实际上在webpack中属于四个app,  如果真是做纯单页面,那应该有二三十个页面吧.所以我这里的多页面应用,是分为四个SPA.比如微信最下面,有四个导航,微信,通讯录,发现,我. 那么这四个导航,就是我的四个SPA,配置多个入口即可. 在这里就不说太多代码了,项目结构将会放

vue中的组件化开发

常常听一些前辈说vue是react的组件化+angular的数据绑定的结合体: 最近刚刚开始使用vue开发项目,我也是在摸索中前进,现在我们来说一说vue的组件化开发. 实际的项目开发,并不像一些文章中的提到的模式,而是如图所示的模式: App.vue是项目的入口.组件实则也是一个以.vue为后缀的文件.我们可以在src\components文件夹下创建一个xxx.vue: 然后在文件中编写可以提出的公共部分的代码为组件.然后在您需要调用该组件的页面,如下图方式调用: 是不是很简单.现在来解释一

Vue组件化开发

一. 通过axios实现数据请求 1. json简介 json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式. json的作用:在不同的系统平台,或不同编程语言之间传递数据. 1.1 json数据的语法 json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量,不支持undefined,值还可以是数组或者jso