Prop驗證、inheritAttrs、$attrs的用法和坑

Prop

  1. Prop驗證javascript

    Vue.component('my-component', {
      props: {
        // 基礎的類型檢查 (`null` 和 `undefined` 會經過任何類型驗證)
        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 ['success', 'warning', 'danger'].indexOf(value) !== -1
          }
        }
      }
    })
    • prop 會在一個組件實例建立以前進行驗證
  2. 非 Prop 的 Attributehtml

    • 若是一個父組件向其子組件傳遞一個屬性,可是子組件沒有使用props接收它,那麼這個屬性就會被添加到子組件的根元素上去,即:在子組件使用 this.$attrs 就能獲取到傳入的屬性對應的值java

    • <div id="app">
          <child-com :name='name' :age='age' :sex='sex'></child-com>
        </div>
      
        <script>
          const vm = new Vue({
            el: '#app', //  父組件
            data: {
              name: 'lyl',
              age: 20,
              sex: '男'
            },
            components: {
              childCom: { //  子組件
                template: `
                  <div>
                    <span> {{name}} </span>
                    <grand-com v-bind='$attrs'></grand-com>  <!-- 注意看這裏,你會發現這裏的 v-bind後面直接跟上的不是一個屬性而是等號 -->
                    <!-- 這樣一來咱們就把 子組件中沒有用到的屬性(除class和style之外)所有傳到了孫子組件 -->
                  </div>
                `,
                props: ['name'],  //  這裏沒有將 age 和 sex 在 props 中接收
                created() {
                  console.log(this.$attrs)  //  控制檯打印:{age:20,sex:男}
                },
                components: {
                  grandCom: { //  孫子組件
                    template: `
                      <div>
                        <span>{{$attrs.age}}</span>
                        <span>{{$attrs.sex}}</span>
                      </div>
                    `,
                  }
                }
              }
            }
          })
      </script>
    • inheritAttrs 屬性的用法數組

    • <div id="app">
          <child-com :name='name' :age='age' :sex='sex'></child-com>
        </div>
      
        <script>
          const vm = new Vue({
            el: '#app', //  父組件
            data: {
              name: 'lyl',
              age: 20,
              sex: '男'
            },
            components: {
              childCom: { //  子組件
                template: `
                  <div>
                    <span> {{name}} </span>
                  </div>
                `,
                props: ['name'],  //  這裏沒有將 age 和 sex 在 props 中接收
                created() {
                  console.log(this.$attrs)  //  控制檯打印:{age:20,sex:男}
                }
              }
            }
          })
        </script>
    • 你就會發現,這裏的div標籤上面被綁定了age、sex這樣的屬性,這就是官方文檔說的非Prop的屬性會被添加被綁定組件的根元素上 ,就如上圖所示,可是每每你是不想這樣作的,那麼就能夠使用 inheritAttrs 屬性了瀏覽器

      用法:在子組件的模板對象中添加 inheritAttrs: false 便可讓這種狀況禁止掉app

      <div id="app">
          <child-com :name='name' :age='age' :sex='sex'></child-com>
        </div>
      
        <script>
          const vm = new Vue({
            el: '#app', //  父組件
            data: {
              name: 'lyl',
              age: 20,
              sex: '男'
            },
            components: {
              childCom: { //  子組件
                inheritAttrs: false,  //  父組件傳入的name、age、sex屬性中除子組件props接收的屬性name外,其餘屬性默認會被瀏覽器渲染成html屬性,可是設置該屬性以後則不會被瀏覽器這樣渲染
                template: `
                  <div>
                    <span> {{name}} </span>
                  </div>
                `,
                props: ['name'],  //  這裏沒有將 age 和 sex 在 props 中接收
                created() {
                  console.log(this.$attrs)  //  控制檯打印:{age:20,sex:男}
                }
              }
            }
          })
        </script>

相關文章
相關標籤/搜索