zoukankan      html  css  js  c++  java
  • Vue.js学习使用心得(四)——组件

    一、组件

    组件(Component)是 Vue.js 最强大的功能之一。

    组件可以扩展 HTML 元素,封装可重用的代码。

    组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:

    例注册一个全局组件:

    js代码:

    Vue.component(tagName, options)    ——————tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:

    html代码:

    <tagName></tagName>

    (一)全局组件

    <body>
        <div id="app">
            <aa></aa>
        </div>
    
        <script>
             // 注册
             Vue.component('aa', {
                  template: '<h1>糖果波自定义组件!</h1>'
             })
             // 创建根实例
             new Vue({
                  el: '#app'
             })
        </script>
    </body>

    (二)局部组件

    <body>
        <div id="app">
            <aa></aa>
        </div>
    
        <script>
            var Child = {
                template: '<h1>糖果波自定义组件!</h1>'
            }
    
            // 创建根实例
            new Vue({
                el: '#app',
                components: {
                // <aa> 将只在父模板可用
               'aa': Child
                }
            })
        </script>
    </body>

    (三)Prop

    prop 是父组件用来传递数据的一个自定义属性。

    父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop"。详细使用方式如下:

    <div id="app">
        <child message="hello!"></child>
    </div>
     
    <script>
    // 注册
    Vue.component('child', {
      // 声明 props
      props: ['message'],
      // 同样也可以在 vm 实例中像 "this.message" 这样使用
      template: '<span>{{ message }}</span>'
    })
    // 创建根实例
    new Vue({
      el: '#app'
    })
    </script>

    (四)动态 Prop

    类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:

    <div id="app">
        <div>
          <input v-model="parentMsg">
          <br>
          <child v-bind:message="parentMsg"></child>
        </div>
    </div>
     
    <script>
    // 注册
    Vue.component('child', {
      // 声明 props
      props: ['message'],
      // 同样也可以在 vm 实例中像 "this.message" 这样使用
      template: '<span>{{ message }}</span>'
    })
    // 创建根实例
    new Vue({
      el: '#app',
      data: {
        parentMsg: '父组件内容'
      }
    })
    </script>
    <div id="app">
        <ol>
        <todo-item v-for="item in sites" v-bind:todo="item"></todo-item>
          </ol>
    </div>
     
    <script>
    Vue.component('todo-item', {
      props: ['todo'],
      template: '<li>{{ todo.text }}</li>'
    })
    new Vue({
      el: '#app',
      data: {
        sites: [
          { text: 'Runoob' },
          { text: 'Google' },
          { text: 'Taobao' }
        ]
      }
    })
    </script>

    注意: prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。

    (五)Prop 验证

    组件可以为 props 指定验证要求。

    prop 是一个对象而不是字符串数组时,它包含验证要求:

    Vue.component('example', {
      props: {
        // 基础类型检测 (`null` 意思是任何类型都可以)
        propA: Number,
        // 多种类型
        propB: [String, Number],
        // 必传且是字符串
        propC: {
          type: String,
          required: true
        },
        // 数字,有默认值
        propD: {
          type: Number,
          default: 100
        },
        // 数组/对象的默认值应当由一个工厂函数返回
        propE: {
          type: Object,
          default: function () {
            return { message: 'hello' }
          }
        },
        // 自定义验证函数
        propF: {
          validator: function (value) {
            return value > 10
          }
        }
      }
    })

    type 可以是下面原生构造器:

    • String
    • Number
    • Boolean
    • Function
    • Object
    • Array

    type 也可以是一个自定义构造器,使用 instanceof 检测。

  • 相关阅读:
    创建一个Django项目
    ubuntu18安装python3, pip3并配置国内源
    DjangoRestFramework实现用户注册
    pycharm打开Django项目,并在浏览器返回HelloWorld
    ubuntu18 安装mysqlclient报错Command "python setup.py egg_info" failed with error code 1 in /tmp/pipbuild8139q6vm/mysqlclient/
    越学习越焦虑? 是时候总结自己的学习方法论了!
    ubuntu18.04 python3安装虚拟环境virtualenv
    (vs2005)使用Log4Net要注意的几个问题。
    (Asp.net,ms sqlserver embbed 2005 edition,windows sharepoint services)安装windows sharepoint service惊魂记
    (asp.net,collabat svn server,bugtrack.net)部署bugtrack.net到服务器上的一点心得
  • 原文地址:https://www.cnblogs.com/tangguobo/p/10310503.html
Copyright © 2011-2022 走看看