1. 程式人生 > >Vue基礎精講 —— Vue的元件之元件的定義、繼承、自定義雙向繫結、高階屬性

Vue基礎精講 —— Vue的元件之元件的定義、繼承、自定義雙向繫結、高階屬性

Vue元件基礎定義

import Vue from 'vue'

const compoent = {
  props: {
    active: {
      // type: Boolean,
      // required: true,
      validator (value) {
        return typeof value === 'boolean'
      }
    },
    propOne: String
  },
  template: `
    <div>
      <input type="text" v-model="text">
      <span @click="handleChange">{{propOne}}</span>
      <span v-show="active">see me if active</span>
    </div>
  `,
  data () {
    return {
      text: 0
    }
  },
  methods: {
    handleChange () {
      this.$emit('changeY')
    }
  }
}

// Vue.component('CompOne', compoent)

new Vue({
  components: {
    CompOne: compoent
  },
  data: {
    prop1: 'test'
  },
  methods: {
    handleChange () {
      this.prop1 = this.prop1 + ' test'
    }
  },
  mounted () {
    console.log(this.$refs.comp1)
  },
  el: '#root',
  template: `
    <div>
      <p>{{prop1}}</p>
      <!--建議傳遞參用下劃線命名,接收引數用駝峰-->
      <!--若傳參是非string,需用:-->
      <
[email protected]
="handleChange"接收子元件派發的change事件,這裡不能@change-y="handleChange"這麼寫--> <comp-one ref="comp1" :active="true" :prop-one="prop1" @changeY="handleChange"></comp-one> <comp-one :active="true" propOne="text2"></comp-one> </div> ` })

Vue元件繼承 

import Vue from 'vue'

const compoent = {
  props: {
    active: Boolean,
    propOne: String
  },
  template: `
    <div>
      <input type="text" v-model="text">
      <p @click="handleChange">propOne引數:{{propOne}}</p>
      <p v-show="active">see me if active</p>
    </div>
  `,
  data () {
    return {
      text: 0
    }
  },
  mounted () {
    console.log('compoent1 comp mounted')
  },
  methods: {
    handleChange () {
      this.$emit('change')
    }
  }
}

const componet2 = {
  extends: compoent, // 繼承compoent
  data () {
    return {
      text: 1
    }
  },
  mounted () {
    console.log('componet2', this.$parent.$options.name)
  }
}

// const CompVue = Vue.extend(compoent)

// new CompVue({
//   el: '#root',
//   propsData: {
//     propOne: 'xxx'
//   },
//   data: {
//     text: '123'
//   },
//   mounted () {
//     console.log('instance mounted')
//   }
// })

const parent = new Vue({
  name: 'parent'
})

new Vue({
  parent: parent, // 設定父元件
  name: 'Root',
  el: '#root',
  mounted () {
    console.log('Root', this.$parent.$options.name)
  },
  components: {
    Comp: componet2
  },
  data: {
    text: '元件1'
  },
  methods: {
    change () {
      console.log('kkkkk')
    }
  },
  template: `
    <div>
      <span>{{text}}</span>
      <comp propOne="propOne" @change="change"></comp>
    </div>
  `
})

元件繼承的執行順序 

Vue自定義元件雙向繫結

import Vue from 'vue'

const component = {
  // 使用model
  model: {
    // prop,子元件接收父元件通過v-model傳遞過來的值,可重新命名為value22
    prop: 'value22',
    // event,該元件在派發emit 'change' 事件的時候,傳遞引數的值就是父元件v-model能夠收到的值。
    event: 'change'
  },
  props: ['value22'], // model中得到的prop值
  template: `
    <div>
      <!--:value為props的值-->
      <input type="text" @input="handleInput" :value="value22">
    </div>
  `,
  methods: {
    handleInput (e) {
      // change為model中的event
      this.$emit('change', e.target.value)
    }
  }
  // 若不使用model接收父元件傳參
  // props: ['value'], // 必須要使用value
  // template: `
  //   <div>
  //     <!--:value為props的值-->
  //     <input type="text" @input="handleInput" :value="value">
  //   </div>
  // `,
  // methods: {
  //   handleInput (e) {
  //     // 這兒必須用input傳送資料,傳送的資料會被父級v-model接收
  //     this.$emit('input', e.target.value)
  //   }
  // }
}

new Vue({
  components: {
    CompOne: component
  },
  el: '#root',
  data () {
    return {
      value11: '123'
    }
  },
  template: `
    <div>
      <!--將父元件資料通過v-model傳遞給子元件-->
      <comp-one v-model="value11"></comp-one>
    </div>
  `
})

Vue元件高階屬性 

import Vue from 'vue'

const ChildComponent = {
  template: '<div>child component: {{data.value}}</div>',
  inject: ['yeye', 'data'], // 跨級元件溝通
  mounted () {
    // console.log(this.yeye, this.value)
  }
}

const component = {
  name: 'comp',
  components: {
    ChildComponent
  },
  // template: `
  //   <div :style="style">
  //     <div class="header">
  //       <slot name="header"></slot>
  //     </div>
  //     <div class="body">
  //       <slot name="body"></slot>
  //     </div>
  //   </div>
  // `,
  template: `
    <div :style="style">
      <slot :value="value" aaa="111"></slot>
      <child-component></child-component>
    </div>
  `,
  data () {
    return {
      style: {
        width: '200px',
        height: '200px',
        border: '1px solid #aaa'
      },
      value: 'component value'
    }
  }
}

new Vue({
  components: {
    CompOne: component
  },
  provide () {
    const data = {}

    Object.defineProperty(data, 'value', {
      get: () => this.value,
      enumerable: true
    })

    return {
      yeye: this,
      data
    }
  },
  el: '#root',
  data () {
    return {
      value: '123'
    }
  },
  mounted () {
    console.log(this.$refs.comp.value, this.$refs.span)
    // 列印vue例項,dom節點,ref用在元件和原生HTML上的區別
  },
  template: `
    <div>
      <comp-one ref="comp">
        <div slot-scope="props" ref="span">
          <P>子元件元件內部變數:{{props.value}} {{props.aaa}}</P>
          <P>當前元件變數:{{value}}</P>
        </div>
      </comp-one>
      <input type="text" v-model="value" />
    </div>
  `
})
// 匿名插槽
// 具名插槽
// 作用域插槽,父元件可使用子元件中的資料slot-scope

與君共勉:再牛逼的夢想,也抵不住傻逼般的堅持!

相關推薦

Vue基礎 —— Vue元件元件定義繼承定義雙向高階屬性

Vue元件基礎定義 import Vue from 'vue' const compoent = { props: { active: { // type: Boolean, // required: true, valid

Vue基礎 —— Vue中computed和watch使用場景和方法

watch和computed都是以Vue的依賴追蹤機制為基礎,它們都試圖處理這樣一件事情:當某一個數據(稱它為依賴資料)發生變化的時候,所有依賴這個資料的“相關”資料“自動”發生變化,也就是自動呼叫相關的函式去實現資料的變動。 methods用來定義函式,它需要手動呼叫才能

vue選單新增選擇,知識:資料雙向迴圈渲染事件點選以及按鍵的點選

要求: 1.可以增加菜名 2.可以刪除菜名 3.點選選擇菜名後自動增加到已選選單中 4.可以在已選選單中取消選擇   程式碼: <template> <div> <input type="text" ref="add"> &

Vue 基礎(二)

模板語法 插值可以標籤中的內容替代為對應資料物件上 name 屬性的值。無論何時,繫結的資料物件上 name 屬性發生了改變,插值處的內容都會更新。{{}}會將資料解釋為普通文字,而非 HTML 程式碼。為了輸出真正的 HTML,需要使用 v-html 指令。(v-text等同與{{

Vue 基礎(四)

條件渲染 v-if v-else v-else-if 用 key 管理可複用的元素 v-show v-if vs v-show v-if 在 Vue 中我們可以通過 v-if 指令來判斷

Vue 基礎(三)

Class 與 Style 繫結 繫結 HTML Class 繫結內聯樣式 繫結 HTML Class 物件語法 對div中的 class 進行繫結後, activated 這個 class 存在與否將取決於資

Vue實戰專案開發--vue基礎

專案的原始碼在GitHub上:點選檢視Vue例項vue的每一個元件都是一個例項,該例項對應著很多屬性和方法。<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"&

Vue 建構函式生命週期與資料雙向

Vue2 建構函式、生命週期與資料雙向繫結 Vue是一個響應式的、漸進式的JavaScript框架,它在設計上採用MVVM模式,將檢視與資料兩部分分離。下面就是一個簡單的Vue例項: <!DOCTYPE html> <html lang="en"> <h

Vue.js的元件(四)父元件與子元件的資料聯絡 雙向

之前有說到,父元件傳資料到子元件是通過元件的屬性props來實現的,這是一種單向繫結。父可以影響子,子不能影響父。 但是子可以通過自定義事件來讓自己的資料影響到父。 只要把這兩種方法結合起來,就可以

vue基礎知識總結(三)元件

元件 元件開發的好處 封裝功能程式碼,提升開發效率 便於團隊分工合作 元件的建立方式(三種) 注意:1.模板template中只能有一個根節點。2.元件名字如果採用駝峰命名,需要加上連字元‘-’,比如元件名為indexA 標籤

vue-路由-導航守衛

foo 取消 表示 path 新增 一個 font 導航 重用 路由跳轉前做一些驗證,比如登錄驗證,是網站中的普遍需求。 對此,vue-route 提供的 beforeRouteUpdate 可以方便地實現導航守衛(navigation-guards)。 導航守衛(nav

vue定義元件實現v-model雙向

vue中父子元件通訊,都是單項的,直接在子元件中修改prop傳的值vue也會給出一個警告,接下來就用一個小列子一步一步實現了vue自定義的元件實現v-model雙向繫結,父元件值變了子元件也會跟著變,子元件中傳過來的值變了,父元件值也會跟著變化。如有錯誤的地方歡迎評論指出 父級元件

VUE雙向及區域性元件的使用

vue的雙向繫結,使用v-model,v-model只能使用在input  textare    select中 <!DOCTYPE html> <html lang="zh-CN"> <head> <

angular,vue,react的基本語法—動態屬性事件ref,angular元件建立方式

基本語法: 動態屬性: vue: v-bind:attr="msg" :attr="msg" react: attr={msg} angular [attr]="msg" 事件繫結: vue: v-on:click="handleChange($eve

Vue,實現元件屬性雙向方式

prop 是單向繫結的:當父元件的屬性變化時,將傳導給子元件,但是不會反過來 A 中 呼叫 B 這個元件 A表示的就是父元件 B表示的就是子元件 如果父元件的值發生了變化,將會傳導給子元件,但是子元件中發生了變化,由於原來子元件的資料已經展示出來,再次修

Vue使用.sync 實現父子元件雙向資料

1.前言 最近在vue 專案中有一個需求, 就是我需要根據不同的型別在頁面中放不同的元件, 元件需要跟當前頁面的資料進行雙向繫結,如果都寫在同一個頁面 程式碼會顯得比較多,畢竟我當前頁面已經7-800行程式碼了 所以我需要把一些元素定義成元件 ,封裝起來,所以就會遇到 資料的傳

Vue父子元件資料雙向,子元件可修改props

父元件 => props[parent-data] => 子元件 => watch[parent-data] => children-data = parent-data // 子元件監聽父元件的改變 子元件 => $emit[children

VUE】使用Table元件進行資料雙向

寫在前面的    由於SIMATIC內部的框架有很多,前後端自成一家。不過前端大部分還是使用了vue。以前也聽說過.NET版本的前後端分離,但也僅僅侷限於聽說,這次可是親身體會到了,對比JAVA,我只

Vue 元件實現表單的雙向

下面是一個簡單的貨幣輸入的自定義控制元件,來自https://cn.vuejs.org/v2/guide/components.html: <body> <div id="curr

Vue非典型封裝Bootstrap-Select公共元件(非同步獲取資料,prop定義函式)

本文重點討論的問題: 1. 如何統一所有例項資料,而不是例項化元件時傳入資料。並非提倡這種做法,結合實際需求。 2. 如何prop元件例項的自定義函式。 以上問題比較鮮見,於是把我的解決思路寫下來跟各位分享。完整具體的實現程式碼就不列出了。 接觸VUE