首頁 > web前端 > js教程 > Vue組件是什麼? Vue元件如何使用? (程式碼範例)

Vue組件是什麼? Vue元件如何使用? (程式碼範例)

青灯夜游
發布: 2018-10-24 17:39:57
轉載
2290 人瀏覽過

這篇文章帶給大家的內容是介紹Vue元件是什麼? Vue元件如何使用? (程式碼範例)。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

元件的介紹

  1. #元件系統是將一個大型的介面切分成一個更小的可控單元。

  2. 元件是可重複使用的,可維護的。

  3. 元件具有強大的封裝性,易於使用。

  4. 大型應用程式中,元件與元件之間互動是可以解耦操作的。

Vue元件的使用

  • 全域元件的使用

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="main.css" />
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <my-header></my-header>
    </div>


    <script>
        //全局组建的定义
        Vue.component("my-header", {
            template: '<h1>全局组件</h1>'
        });
        var app = new Vue({
            el: '#app',
        });
    </script>

</body>

</html>
登入後複製
  •  局部元件的使用

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="main.css" />
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <my-header></my-header>
    </div>


    <script>
        //局部组件定义
        var app = new Vue({
            el: '#app',
            components: {
                'my-header': {
                    template: '<h1>局部组件</h1>'
                }
            }
        });
    </script>

</body>

</html>
登入後複製
  • 元件資料的特性

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <my-header></my-header>
        <my-header></my-header>
        <br>
        <my-header1></my-header1>
        <my-header1></my-header1>
    </div>

    <script>
        //组件数据之间不共享,Vue实例中的数据也不能共享给组件,并且组件中的data只能使用函数
        //组件的数据data使用函数的特点是每次点击或操作组件函数会重新执行,这样就不会影响其它组件,通过下面两个例子可以看出
        var data = {
            count: 0
        };
        var app = new Vue({
            el: '#app',
            data: {
                message: "Hello Vue!!!"
            },
            components: {
                'my-header': {
                    template: '<h1 v-on:click="changeCount">{{count}}</h1>',
                    data: function() {
                        return data;
                    },
                    methods: {
                        changeCount: function() {
                            this.count++;
                        }
                    }
                },
                'my-header1': {
                    template: '<div v-on:click="changeCount1">{{count}}</div>',
                    data: function() {
                        return {
                            count: 0
                        };
                    },
                    methods: {
                        changeCount1: function() {
                            this.count++;
                        }
                    }
                }
            }
        });
    </script>

</body>

</html>
登入後複製
  • Vue實例與元件之間的關係

##Vue元件其實是一個可擴充的Vue實例。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        {{message}}
    </div>

    <script>
        //Vue组件其实是一个可扩展的Vue实例,Vue实例也可以看成是一个组件
        // var app = new Vue({
        //     el: '#app',
        //     template: '<h1>app应用</h1>'
        // });
        //使用继承实现Vue组件
        var myComponent = Vue.extend({
            data: function() {
                return {
                    message: "Hello Vue@@@"
                }
            }
        });
        var vm = new myComponent({
            el: '#app'
        });
    </script>

</body>

</html>
登入後複製
  •  Vue元件的範本方式

  1. \

  2. `

  3. ##
  4. .vue 單一檔案
  5. <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Page Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    </head>
    
    <body>
        <div id="app">
            <my-header></my-header>
            <my-header-1></my-header-1>
            <my-header-2></my-header-2>
            <my-header-3></my-header-3>
        </div>
    
    
        <template id="temp">
                <div>
                    <p>
                        <ul>
                                <li>1</li>
                                <li>2</li>
                                <li>3</li>
                            </ul>
                        </p>
                    </div>
        </template>
        <script type="text/x-template" id="temp1">
            <div>
                <p>
                    <ul>
                        <li>1</li>
                        <li>2</li>
                        <li>3</li>
                    </ul>
                </p>
            </div>
        </script>
        <script>
            //Vue模版添加方式
            var app = new Vue({
                el: '#app',
                components: {
                    'my-header': {
                        template: '<div>\
                                        <p>\
                                            <ul>\
                                                <li>1</li>\
                                                <li>2</li>\
                                                <li>3</li>\
                                            </ul>\
                                        </p>\
                                    </div>',
                        data: function() {
                            return {
                                message: "第一项"
                            }
                        }
                    },
                    'my-header-1': {
                        template: `<div>
                                        <p>
                                            <ul>
                                                <li>1</li>
                                                <li>2</li>
                                                <li>3</li>
                                            </ul>
                                        </p>
                                    </div>`,
                    },
                    'my-header-2': {
                        template: '#temp'
                    },
                    'my-header-3': {
                        template: '#temp1'
                    }
    
                }
            });
        </script>
    
    </body>
    
    </html>
    登入後複製
  • # Vue父元件向子元件通訊(props)

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Page Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    </head>
    
    <body>
        <div id="app">
            <!-- 数据在组件中 -->
            <my-header></my-header>
            <!-- 父组件向子组件传递数据 -->
            <my-header-1 :list="temp_2_list"></my-header-1>
            <!-- 父组件向子组件传递数据不给值 -->
            <my-header-1></my-header-1>
    
        </div>
        <!-- 数据在组件中的模版 -->
        <template id="temp-1"> 
                <div>
                        <h1>{{message}}</h1>
                        <ul>
                            <li v-for="item in list">{{item}}</li>
                        </ul>
                    </div>
        </template>
        <!-- 父组件向子组件传递数据的模版 -->
        <template id="temp-2">
                <div>
                        <h1>{{message}}</h1>
                        <ul>
                            <li v-for="item in list">{{item}}</li>
                        </ul>
                        <my-nav :itemlist = "list"></my-nav>
                    </div>
        </template>
        <!-- 子组件向子组件传递数据的模版 -->
        <template id="temp-3">
                <div>
                        <h1>{{message}}</h1>
                        <ul>
                            <li v-for="item in itemlist">{{item}}</li>
                        </ul>
                    </div>
        </template>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    temp_2_list: ["1", "2", "3"]
                },
                components: {
                    //数据在自己组件中的实例
                    'my-header': {
                        template: '#temp-1',
                        data: function() {
                            return {
                                list: ["1", "2", "3"],
                                message: "组件中的数据"
                            };
                        }
                    },
                    //父组件向子组件传递数据
                    'my-header-1': {
                        //props: ["list"],
                        template: '#temp-2',
                        data: function() {
                            return {
                                message: "父组件向子组件传递数据"
                            };
                        },
                        //属性的验证与默认值
                        props: {
                            list: {
                                type: Array,
                                default: ["4", "5", "6"]
                            }
                        },
                        //子组件的子组件
                        components: {
                            'my-nav': {
                                template: '#temp-3',
                                data: function() {
                                    return {
                                        message: "子组件中的子组件"
                                    };
                                },
                                props: ["itemlist"]
                            }
                        }
                    }
                }
            });
        </script>
    
    </body>
    
    </html>
    登入後複製
  • 子元件向父元件通訊(EmitEvents)

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Page Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    </head>
    
    <body>
        <div id="app">
            <my-header-1 :list="temp_2_list"></my-header-1>
    
        </div>
        <!-- 父组件向子组件传递数据的模版 -->
        <template id="temp-2">
            <div>
                    <h1>{{message}}</h1>
                    <ul>
                        <li v-for="item in list">{{item}}</li>
                    </ul>
                    <my-nav :itemlist = "list" v-on:change-events="getChildContent"></my-nav>
                </div>
    </template>
        <!-- 子组件向子组件传递数据的模版 -->
        <template id="temp-3">
            <div>
                    <h1>{{message}}</h1>
                    <ul>
                        <li v-for="item in itemlist" v-on:click="getContent">{{item}}</li>
                    </ul>
                </div>
    </template>
    
        <script>
            //子组件向父组件传递数据,是发布订阅模式
            var vm = new Vue({
                el: '#app',
                data: {
                    temp_2_list: ["1", "2", "3"]
                },
                components: {
                    //父组件向子组件传递数据
                    'my-header-1': {
                        //props: ["list"],
                        template: '#temp-2',
                        data: function() {
                            return {
                                message: "父组件向子组件传递数据"
                            };
                        },
                        //属性的验证与默认值
                        props: {
                            list: {
                                type: Array,
                                default: ["4", "5", "6"]
                            }
                        },
                        methods: {
                            getChildContent: function(str) {
                                debugger
                                alert(str);
                            }
                        },
                        //子组件的子组件
                        components: {
                            'my-nav': {
                                template: '#temp-3',
                                data: function() {
                                    return {
                                        message: "子组件中的子组件"
                                    };
                                },
                                props: ["itemlist"],
                                methods: {
                                    getContent: function(ev) {
                                        // console.log(this);
                                        // console.log(ev.target.innerHTML);
                                        this.$emit("change-events", ev.target.innerHTML);
                                    }
                                }
                            }
                        }
                    }
                }
            });
        </script>
    
    </body>
    
    </html>
    登入後複製
  •  Vue非父子元件的通訊

##空白實例與自訂事件
  1. $emit
    1. #$on
  2. # Vuex狀態管理

    1. state

    2. #mutation

    3. commit

空白實例與自訂事件的使用(適用於小型專案)

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    <style>
        ul {
            list-style-type: none;
        }
    </style>
</head>

<body>
    <div id="app">
        <my-header-1></my-header-1>
        <my-header-2></my-header-2>

    </div>

    <script>
        //非父子组件通信

        //1.0 使用空实例进行非父子组件通信
        //定义空实例
        //创建步骤是:
        //1、首先定义一个空实例 
        //2、需要给被传递数据的A组件使用$emit绑定自定义事件,并将A组件的数据发布给B组件 
        //3、使用$on订阅A组件发布过来的数据,从而获取数据
        var busVm = new Vue();
        var vm = new Vue({
            el: '#app',
            components: {
                //组件B
                'my-header-1': {
                    template: `<h1>{{message}}</h1>`,
                    data: function() {
                        return {
                            message: "非父子组件通信"
                        };
                    },
                    mounted() {
                        //使用bind(this)修正this
                        busVm.$on("changeEnvents", function(param) {
                            this.message = param;
                        }.bind(this));
                    },
                },
                //组件A
                'my-header-2': {
                    template: `<ul><li @click="getContent" v-for="item in list">{{item}}</li></ul>`,
                    data: function() {
                        return {
                            list: ["第一项", "第二项", "第三项"]
                        };
                    },
                    methods: {
                        getContent: function(ev) {
                            busVm.$emit("changeEnvents", ev.target.innerHTML);
                        }
                    }
                }
            }
        });
    </script>

</body>

</html>
登入後複製
Vuex狀態管理

  • Vue元件內容分發

    • 標籤使用

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
    <style>
        ul {
            list-style-type: none;
        }
    </style>
</head>

<body>
    <div id="app">
        <my-header-1>
            <h1>我是标题</h1>
        </my-header-1>

        <my-header-1>
            <my-header-2></my-header-2>
        </my-header-1>

    </div>

    <script>
        //单插槽<slot></slot>
        var vm = new Vue({
            el: '#app',
            components: {
                'my-header-1': {
                    template: `<div>我是头部:<slot></slot></div>`,

                },
                'my-header-2': {
                    template: `<h1>我是标题</h1>`,
                }
            }
        });
    </script>

</body>

</html>
登入後複製
  1. #多標籤使用

  2. <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Page Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
        <style>
            ul {
                list-style-type: none;
            }
        </style>
    </head>
    
    <body>
        <div id="app">
           
            <my-header-1>
                <button slot="left">←</button>
                <button slot="right">→</button>
            </my-header-1>
    
        </div>
    
        <script>
    
    
            //多插槽的使用,则使用name属性来指定要插入的位置
            var vm = new Vue({
                el: '#app',
                components: {
                    'my-header-1': {
                        template: `<div><slot name="left"></slot> 我是头部:<slot name="right"></slot></div>`,
                    },
                    'my-header-2': {
                        template: `<h1>我是标题</h1>`,
                    }
                }
            });
        </script>
    
    </body>
    
    </html>
    登入後複製

  3.   預設值
  4. #
    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Page Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
        <style>
            ul {
                list-style-type: none;
            }
        </style>
    </head>
    
    <body>
        <div id="app">
    
            <my-header-1>
                <button slot="left">←</button>
                <button slot="right">→</button>
            </my-header-1>
    
        </div>
    
        <script>
            //多插槽的使用,则使用name属性来指定要插入的位置
            var vm = new Vue({
                el: '#app',
                components: {
                    'my-header-1': {
                        template: `<div><slot name="left"></slot> 我是头部:<slot name="right"><button slot="right">+</button></slot></div>`,
                    },
                    'my-header-2': {
                        template: `<h1>我是标题</h1>`,
                    }
                }
            });
        </script>
    
    </body>
    
    </html>
    登入後複製
  5. Vue元件開發流程
  • #撰寫基礎HTML與CSS

    • ###########撰寫基礎HTML與CSS###########擷取元件############資料傳輸############內容分發############新增事件與方法##### #############Vue中DOM運算(使用$refs)##################
      <!DOCTYPE html>
      <html>
      
      <head>
          <meta charset="utf-8" />
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <title>Page Title</title>
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
      </head>
      
      <body>
          <div id="app">
              <my-header-1 :list="temp_2_list"></my-header-1>
      
          </div>
          <!-- 父组件向子组件传递数据的模版,ref特性用于DOM操作,使用this.$refs.row获取添加特性的DOM元素 -->
          <template id="temp-2">
              <div>
                      <h1>{{message}}</h1>
                      <ul >
                          <li  v-for="item in list" v-on:click="updateStyle" style="color:blue" ref="row">{{item}}</li>
                      </ul>
                      
                  </div>
            </template>
      
          <script>
              //子组件向父组件传递数据,是发布订阅模式
              var vm = new Vue({
                  el: '#app',
                  data: {
                      temp_2_list: ["1", "2", "3"]
                  },
                  components: {
                      //父组件向子组件传递数据
                      'my-header-1': {
                          //props: ["list"],
                          template: '#temp-2',
                          data: function() {
                              return {
                                  message: "父组件向子组件传递数据"
                              };
                          },
                          //属性的验证与默认值
                          props: {
                              list: {
                                  type: Array,
                                  default: ["4", "5", "6"]
                              }
                          },
                          methods: {
                              updateStyle: function(ev) {
                                  ev.target.style.color = 'red';
                                  // this.$refs.row.style.color = 'red';
                                  console.log(this.$refs.row);
                                  this.$refs.row.forEach(element => {
                                      console.log(element);
                                      element.style.color = 'red';
                                  });
                              }
                          }
                      }
                  }
              });
          </script>
      </body>
      </html>
      登入後複製

      以上是Vue組件是什麼? Vue元件如何使用? (程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

      相關標籤:
      來源:cnblogs.com
      本網站聲明
      本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
      熱門教學
      更多>
      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板