当前位置:   article > 正文

Vue全家桶之组件(component)_vue component组件

vue component组件

1、Vue的标准开发方式

【1】Vue推荐的开发方式是 ------------- SPA(Single Page (Web) Application ) 单页面 Web 应用

【2】什么是 SPA (单页面应用) ?

单页面应用 :就是日后项目中只有一张页面 =========== 》》 》 index . html

【3】为什么Vue推荐开发方式SPA(单页面应用)的开发方式?

a、引入Vue js 文件

b、在现有的页面中创建一个Vue实例对象

一个页面中只能存在一个 Vue 实例

Vue 推荐的开发方式 : 一个应用中只能存在一个Vue实例

【4】使用现有的手段严格遵循SPA存在问题?

a、现有的开发方式会导致项目中唯一一个页面中代码会越来越多,不利于维护

b、现有开发方式导致项目中唯一 一个页面中完成全部业务功能,导致当前页面每次加载的速度非常的慢

【5】为了严格遵循SPA开发方式在Vue中提供了 Vue 组件(component)

组件作用:

1、减少Vue根实例的代码量

2、一个组件负责完成项目中的一个功能或一组功能实现业务功能隔离

3、组件还可以在Vue实现复用

【6】组件如何使用?

a、全局组件:直接注册到vue根实例的组件

Vue.component( ' ' ) // 注册这个就是全局组件

b、局部组件:只能在注册组件中使用的组件

const app = new Vue({

el:" ";

data:{ },

methods:{ },

computed:{ },

created(){ },

components:{ } , // 注册局部组件

})

最大的不同: 作用范围不同 ,如果是全局的,任何地方可用; 如果是局部的,当前组件可用

【7】组件的基本使用

a、全局组件的使用

1)定义组件

Vue.component('login', { //两个参数:参数一:组件名 参数二:组件的配置对象 ​ template: <h2>用户登录</h2>, //用来书写该组件的html代码 ​ });

2)使用组件

< login> < /login>

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}</h1>
  4. <!-- 登录 -->
  5. <login></login>
  6. <!-- 注册 -->
  7. <register></register>
  8. </div>
  9. </body>
  10. </html>
  11. <script src="../../js/vue.js"></script>
  12. <script>
  13. //1、定义一个登录的全局组件
  14. Vue.component('login', { //两个参数:参数一:组件名 参数二:组件的配置对象
  15. template: `<h2>用户登录</h2>`, //用来书写该组件的html代码
  16. });
  17. //1、定义一个注册的全局组件
  18. Vue.component('register', { //两个参数:参数一:组件名 参数二:组件的配置对象
  19. template: `<h2>用户注册</h2>`, //用来书写该组件的html代码
  20. });
  21. </script>

b、局部组件的使用

1)定义组件

  1. //定义一个局部组件
  2. components: {
  3. add: { // 语法: 组件名:{ template:` `}
  4. template: `<h2>用户添加</h2>`
  5. }
  6. }

2)使用组件

  1. <!-- 添加 -->
  2. <add></add>
  1. <body>
  2. <div id="app">
  3. <!-- 添加 -->
  4. <add></add>
  5. </div>
  6. </body>
  7. </html>
  8. <script src="../../js/vue.js"></script>
  9. <script>
  10. const app = new Vue({
  11. el: "#app",
  12. data: {
  13. msg: "Vue中组件使用"
  14. },
  15. methods: {
  16. },
  17. computed: {
  18. },
  19. created() {
  20. },
  21. //定义一个局部组件
  22. components: {
  23. add: { // 语法: 组件名:{ template:` `}
  24. template: `<h2>用户添加</h2>`
  25. }
  26. }
  27. })
  28. </script>

【8】Vue组件中定义组件数据data 、methods、computed、components

组件的生命周期分为四个阶段:

  • create(创建)

  • mount(挂载)

  • update(更新)

  • destroy(销毁)

组件中可以定义自己的data 、methods、computed、components、生命周期函数、以及自己的子组件。

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}</h1>
  4. <!-- 使用登录组件 -->
  5. <login></login>
  6. <register></register>
  7. </div>
  8. </body>
  9. </html>
  10. <script src="../../js/vue.js"></script>
  11. <script>
  12. // 定义一个全局组件
  13. Vue.component('register', {
  14. template: `<h1>我是全局组件</h1>`
  15. })
  16. //定义一个局部组件
  17. const login = {
  18. template: `<div><h1>用户登录</h1><h2>{{count}}--------------{{countSqrt}}</h2><h2>{{msg}}</h2><aa></aa><register></register><button @click="add">点我count++</button></div>`,
  19. data() { //用来给当前组件定义属于组自己的数据 组件中定义的data必须是一个函数
  20. return { //在return中可以定义数据
  21. count: 0,
  22. msg: "我是组件的msg",
  23. }
  24. },
  25. methods: {
  26. add() {
  27. this.count++;
  28. }
  29. },
  30. computed: {
  31. countSqrt() {
  32. return this.count * this.count;
  33. }
  34. },
  35. components: {
  36. aa: {
  37. template: `<h1>我是aa子组件</h1>`
  38. }
  39. }
  40. };
  41. const app = new Vue({
  42. el: "#app",
  43. data: {
  44. msg: "Vue组件中定义组件的data、methods、components等"
  45. },
  46. // 定义一个局部组件
  47. components: { //用来定义局部组件
  48. login,
  49. }
  50. })
  51. </script>

【9】Vue中父组件向子组件传递数据props

日后 Vue开发: 一切皆组件

(1) props 机制:

1、定义:Vue中提供一个特有数据传递机制

2、作用:在使用Vue组件时,如果需要通过父组件给组件传递数据可以通过 props 进行实现

(2) props的使用:

作用:props用来给组件传递相应静态数据或者是动态数据

a、传递静态数据: 在组件使用的标签上声明静态数据 key = value 在组件定义的内部使用props进行接收数据

注意:使用props机制接收数据就相当于自己组件data中声明一个这样的数据

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}</h1>
  4. <login title="我是标题" count="0"></login>
  5. </div>
  6. </body>
  1. <script src="../../js/vue.js"></script>
  2. <script>
  3. //定义组件对象
  4. const login = {
  5. props: ['title', 'count'],
  6. template: `<div><h1>{{title}} ----------- {{loginTitle}} ----------- {{count}}</h1></div>`,
  7. data() {
  8. return {
  9. loginTitle: this.title,
  10. }
  11. },
  12. };
  13. const app = new Vue({
  14. el: "#app",
  15. data: {
  16. msg: "组件之间的数据传递",
  17. },
  18. components: {
  19. login,
  20. }
  21. })
  22. </script>

b、传递动态数据

根据属性绑定来实现

单项数据流

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}</h1>
  4. <input type="text" v-model="name">
  5. <!-- 向子组件传递一个动态数据 -->
  6. <login :name="name" :msg="msg"></login>
  7. </div>
  8. </body>
  1. <script src="../../js/vue.js"></script>
  2. <script>
  3. //定义组件对象
  4. const login = {
  5. props: ['name', 'msg'],
  6. template: `<div><h1>{{name}} ----------- {{msg}}</h1></div>`,
  7. data() {
  8. return {
  9. }
  10. },
  11. };
  12. const app = new Vue({
  13. el: "#app",
  14. data: {
  15. msg: "组件之间的传递",
  16. name: "我是vue实例管理数据"
  17. },
  18. components: {
  19. login,
  20. }
  21. })
  22. </script>

【10】Vue中父组件向子组件传递事件并通过事件子组件传递数据到父组件

 

(1)Vue中父组件向子组件传递事件

在使用组件时,向组件传递事件

1、直接在对应的组件标签上定义 传递的事件即可 @key = value

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}</h1>
  4. <login @aa="testParent"></login>
  5. </div>
  6. </body>

  1. <script src="../../js/vue.js"></script>
  2. <script>
  3. const login = {
  4. template: `<div><h3>用户登录</h3> <button @click="testChild">点我去掉父组件中某个事件</button></div>`,
  5. methods: {
  6. testChild() {
  7. alert("我是子组件中定义的事件");
  8. //调用父组件中的testParent
  9. this.$emit('aa'); //用来调用父组件传递过来的事件
  10. }
  11. }
  12. };
  13. const app = new Vue({
  14. el: "#app",
  15. data: {
  16. msg: "组件之间的事件传递",
  17. },
  18. methods: {
  19. testParent() {
  20. alert("我是父组件上的事件")
  21. }
  22. },
  23. components: {
  24. login,
  25. }
  26. })
  27. </script>

(2)通过事件子组件传递数据到父组件

1、 标签里边 @aa = " 父级事件 " ,在子组件中通过 this.$emit('aa' ,this.count ) 获取 aa 以及 父级事件,并将子组件中的数据this.count 传入到 父级事件以参数形式接收。

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}{{count}}</h1>
  4. <login @aa="testParent"></login>
  5. </div>
  6. </body>

  1. <script src="../../js/vue.js"></script>
  2. <script>
  3. //子组件
  4. const login = {
  5. template: `<div><h3>用户登录</h3> <button @click="testChild">点我去掉父组件中某个事件</button></div>`,
  6. data() {
  7. return {
  8. count: 19,
  9. }
  10. },
  11. methods: {
  12. testChild() {
  13. alert("我是子组件中定义的事件");
  14. //调用父组件中的testParent
  15. this.$emit('aa', this.count); //用来调用父组件传递过来的事件
  16. }
  17. }
  18. };
  19. //父组件
  20. const app = new Vue({
  21. el: "#app",
  22. data: {
  23. msg: "组件之间的事件传递",
  24. count: 0,
  25. },
  26. methods: {
  27. testParent(count) {
  28. alert("我是父组件上的事件");
  29. console.log(count);
  30. this.count = count;
  31. }
  32. },
  33. components: {
  34. login,
  35. }
  36. })
  37. </script>

【11】组件的插槽使用slot

插槽 : slot

作用:用来扩展现有的组件,让组件变得更加灵活

插槽:占位

具名插槽 :带有名字的插槽

默认插槽 :默认插入全部插槽中

  1. <body>
  2. <div id="app">
  3. <h1>{{msg}}</h1>
  4. <!--
  5. 插槽:占位
  6. 具名插槽 :带有名字的插槽
  7. 默认插槽 :默认插入全部插槽中
  8. -->
  9. <login></login>
  10. <login><span slot="bb">欢迎进入我们的网站{{msg}}</span></login>
  11. <hr>
  12. <login><span slot="aa">Welcome come to aa</span></login>
  13. </div>
  14. </body>

  1. <script src="../../js/vue.js"></script>
  2. <script>
  3. const login = {
  4. template: `<div><slot name="aa"></slot><h3>用户登录</h3><slot name="bb"></slot></div>`,
  5. }
  6. const app = new Vue({
  7. el: "#app",
  8. data: {
  9. msg: "组件的slot(插槽)使用"
  10. },
  11. components: {
  12. login,
  13. }
  14. })
  15. </script>

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/82687
推荐阅读
  

闽ICP备14008679号