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