摘要:更推薦用和實現(xiàn)父子組件通信創(chuàng)建實例此時打印出組件繼承使用基礎(chǔ)構(gòu)造器,創(chuàng)建一個子類。包含組件選項的對象創(chuàng)建構(gòu)造器創(chuàng)建實例,并掛載到一個元素上。該對象包含可注入其子孫的屬性。和綁定并不是可響應(yīng)的。
關(guān)于組件名:
*組件名可以是kebab-case (短橫線分隔命名)或者PascalCase (駝峰式命名) 當(dāng)使用 kebab-case (短橫線分隔命名) 定義一個組件時,你也必須在引用這個自定義元素時使用 kebab-case當(dāng)使用 PascalCase (駝峰式命名) 定義一個組件時,你在引用這個自定義元素時兩種命名法都可以使用。*
//在注冊之后可以用在任何新創(chuàng)建的 Vue 根實例 (new Vue) 的模板中 Vue.component("my-component-name", { // ... 選項 ... })
const component = { template: ` `, data() { return { text: 123 } }, methods:{ } } const app = new Vue({ //el:"#root", components: { comp: component }, template: "", }).$mount("#root")
注意:組件的模板只能有一個根元素。下面的情況是不允許的。
template: `這是一個局部的自定義組件,只能在當(dāng)前Vue實例中使用 hello`,
當(dāng)我們定義這個 組件時,你可能會發(fā)現(xiàn)它的 data 并不是像這樣直接提供一個對象:
data: { count: 0 }
取而代之的是,一個組件的 data 選項必須是一個函數(shù),因此每個實例可以維護一份被返回對象的獨立的拷貝:
data: function () { return { count: 0 } }
如果 Vue 沒有這條規(guī)則,所有模板都會共享一份數(shù)據(jù)。
有些 HTML 元素,諸如
這會導(dǎo)致我們使用這些有約束條件的元素時遇到一些問題。例如:
這個自定義組件 會被作為無效的內(nèi)容提升到外部,并導(dǎo)致最終渲染結(jié)果出錯。幸好這個特殊的 is 特性給了我們一個變通的辦法:
需要注意的是如果我們從以下來源使用模板的話,這條限制是不存在的:
字符串 (例如:template: "...")單文件組件 (.vue)
Prop 類型
//普通類型 props: ["title", "likes", "isPublished", "commentIds", "author"]
//指定類型 props: { title: String, likes: Number, isPublished: Boolean, commentIds: Array, author: Object }
單項數(shù)據(jù)流,傳遞過后不能修改有兩種常見的試圖改變一個 prop 的情形:
//這個 prop 用來傳遞一個初始值;這個子組件接下來希望將其作為一個本地的 prop 數(shù)據(jù)來使用。 props: ["initialCounter"], data: function () { return { counter: this.initialCounter } }
//這個 prop 以一種原始的值傳入且需要進行轉(zhuǎn)換 props: ["size"], computed: { normalizedSize: function () { return this.size.trim().toLowerCase() } }
Vue.component("my-component", { props: { // 基礎(chǔ)的類型檢查 (`null` 匹配任何類型) propA: Number, // 多個可能的類型 propB: [String, Number], // 必填的字符串 propC: { type: String, required: true }, // 帶有默認(rèn)值的數(shù)字 propD: { type: Number, default: 100 }, // 帶有默認(rèn)值的對象 propE: { type: Object, // 對象或數(shù)組且一定會從一個工廠函數(shù)返回默認(rèn)值 default: function () { return { message: "hello" } } }, // 自定義驗證函數(shù) propF: { validator: function (value) { // 這個值必須匹配下列字符串中的一個 return ["success", "warning", "danger"].indexOf(value) !== -1 } } } })
類型:Vue instance
詳細:
指定已創(chuàng)建的實例之父實例,在兩者之間建立父子關(guān)系。子實例可以用 this.$parent 訪問父實例,子實例被推入父實例的 $children 數(shù)組中。
//定義一個父組件 const parent = new Vue({ name: "parent" }) //定義一個組件 const componet2 = { data () { return { text: 1 } }, mounted () { console.log(this.$parent.$options.name) //打印Root this.$parent.text = 1234; //也可以修改,節(jié)制地使用 $parent 和 $children - 它們的主要目的是作為訪問組件的應(yīng)急方法。更推薦用 props 和 events 實現(xiàn)父子組件通信 } } //創(chuàng)建vue實例 new Vue({ parent: parent, name: "Root", el: "#root", mounted () { console.log(this.$parent.$options.name) //此時打印出"parent" }, components: { Comp: componet2 }, data: { text: 23333 }, template: ` {{text}} ` })
Vue.extend( options )使用基礎(chǔ) Vue 構(gòu)造器,創(chuàng)建一個“子類”。參數(shù)是一個包含組件選項的對象。
//包含組件選項的對象 const compoent = { props: { active: Boolean, propOne: String }, template: ` {{propOne}} see me if active `, data () { return { text: 0 } }, mounted () { console.log("comp mounted") }, methods: { handleChange () { this.$emit("change") } } } // 創(chuàng)建構(gòu)造器 const CompVue = Vue.extend(compoent) // 創(chuàng)建 CompVue實例,并掛載到一個元素上。 new CompVue({ el: "#root", propsData: { //傳遞props屬性 propOne: "xxx" }, data: { //可以覆蓋或者合并 text: "123" }, mounted () { //不會覆蓋 ,都會被調(diào)用 console.log("instance mounted") } })
// 1定義一個組件對象 const component = { props: ["value"], template: ` //綁定傳遞過來的value `, methods: { //向父組件觸發(fā)事件 handleInput (e) { this.$emit("input", e.target.value) } } } //2定義一個實例 new Vue({ components: { CompOne: component }, el: "#root", data () { return { value: "123" } }, //接受事件并改變value進行屬性傳遞 template: ` {{value}} ` })
const component = { // model: { // prop: "value1", // event: "change" // }, props: ["value"], template: ` `, methods: { handleInput (e) { this.$emit("input", e.target.value) } } } new Vue({ components: { CompOne: component }, el: "#root", data () { return { value: "123" } }, template: ` {{value}} //直接使用v-model綁定 ` })
允許一個自定義組件在使用 v-model 時定制 prop 和 event。默認(rèn)情況下,一個組件上的 v-model 會把 value 用作 prop 且把 input 用作 event,但是一些輸入類型比如單選框和復(fù)選框按鈕可能想使用 value prop 來達到不同的目的。使用 model 選項可以回避這些情況產(chǎn)生的沖突。
import Vue from "vue" const component = { model: { prop: "value1", //綁定value1 event: "change"http://綁定事件 }, props: ["value","value1"], template: ` `, methods: { handleInput (e) { this.$emit("change", e.target.value) } } } new Vue({ components: { CompOne: component }, el: "#root", data () { return { value: "123" } }, template: ` {{value}} ` })
兄弟間的組件傳遞:
1.使用vue官方提供的vuex(有一定難度,學(xué)習(xí)成本較大) 2.發(fā)布訂閱模式(總線機制,Bus)
Document
const component = { template: ` //vue的默認(rèn)組件,放置插槽的地方 `, data () { return { style: { width: "200px", height: "200px", border: "1px solid #aaa" }, value: "component value" } } } new Vue({ components: { CompOne: component }, el: "#root", data () { return { value: "123" } }, mounted () { }, template: ` this is contne //傳遞插槽內(nèi)容 ` })
有些時候我們需要多個插槽,可以進行命名;
import Vue from "vue" const component = { template: ` //進行插槽命名 `, data () { return { style: { width: "200px", height: "200px", border: "1px solid #aaa" }, value: "component value" } } } new Vue({ components: { CompOne: component }, el: "#root", data () { return { value: "123" } }, mounted () { }, template: ` this is header ///向指定的內(nèi)容 this is body ` })
可以在 標(biāo)簽內(nèi)部指定默認(rèn)的內(nèi)容來做到這一點。
Submit
如果父組件為這個插槽提供了內(nèi)容,則默認(rèn)的內(nèi)容會被替換掉。
import Vue from "vue" const component = { template: ` //向外傳遞的數(shù)據(jù) `, data () { return { style: { width: "200px", height: "200px", border: "1px solid #aaa" }, value: "component value" } } } new Vue({ components: { CompOne: component }, el: "#root", data () { return { value: "123" } }, mounted () { console.log(this.$refs.comp.value, this.$refs.span) //打印出組件實例和HTML標(biāo)簽 }, template: ` {{value}} //此時沒有作用域,訪問到的不是組件內(nèi)的value,而是外部的value //添加作用域,組件內(nèi)部傳遞的數(shù)據(jù)都保存在props對象中 {{props.value}} ` })
Document change
這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在起上下游關(guān)系成立的時間里始終生效。
import Vue from "vue" const ChildComponent = { template: "child component:", inject: ["yeye","value"], mounted () { console.log(this.$parent.$options.name) //上一級 console.log(this.yeye,this.value) //上上一級,接受到的數(shù)據(jù),打印出上上一級的vue實例和123 } } const component = { name: "comp", components: { ChildComponent }, template: ` `, data () { return { style: { width: "200px", height: "200px", border: "1px solid #aaa" }, value: "component value", value2: "component222 value" } } } new Vue({ components: { CompOne: component }, provide () { //和data一樣,可以調(diào)用相應(yīng)的值,是一個對象或返回一個對象的函數(shù)。該對象包含可注入其子孫的屬性。 return { yeye: this, value:this.value } }, el: "#root", data () { return { value: "123" } }, mounted () { console.log(this.$refs.comp.value2, this.$refs.span) }, template: ` {{props.value}} ` })
provide 和 inject 綁定并不是可響應(yīng)的。這是刻意為之的。provide 和 inject 綁定并不是可響應(yīng)的。這是刻意為之的。
import Vue from "vue" const ChildComponent = { template: "child component:{{data.value}}", inject: ["yeye","data"], mounted () { console.log(this.$parent.$options.name) //上一級 console.log(this.yeye,this.value) //上一級 } } const component = { name: "comp", components: { ChildComponent }, // template: ` // // // // // // // // // `, template: ` `, data () { return { style: { width: "200px", height: "200px", border: "1px solid #aaa" }, value: "component value", value2: "component222 value" } } } new Vue({ components: { CompOne: component }, provide () { //和data一樣,可以調(diào)用相應(yīng)的值 const data = {} // es5雙向綁定實現(xiàn)原理 Object.defineProperty(data, "value", { get: () => this.value, //獲取最新value,每次調(diào)用value相當(dāng)于get()方法 enumerable: true //可讀取 }) return { yeye: this, // value:this.value data } }, el: "#root", data () { return { value: "123" } }, mounted () { console.log(this.$refs.comp.value2, this.$refs.span) }, template: ` {{props.value}} ` })
provide 和 inject 主要為高階插件/組件庫提供用例。并不推薦直接用于應(yīng)用程序代碼中。
參考:渲染函數(shù)&JSX
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/113712.html
摘要:更推薦用和實現(xiàn)父子組件通信創(chuàng)建實例此時打印出組件繼承使用基礎(chǔ)構(gòu)造器,創(chuàng)建一個子類。包含組件選項的對象創(chuàng)建構(gòu)造器創(chuàng)建實例,并掛載到一個元素上。該對象包含可注入其子孫的屬性。和綁定并不是可響應(yīng)的。 組件注冊 關(guān)于組件名: *組件名可以是kebab-case (短橫線分隔命名)或者PascalCase (駝峰式命名) 當(dāng)使用 kebab-case (短橫線分隔命名) 定義一個組件時,你也必...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:就是實例中的對象當(dāng)前組件接收到的對象。當(dāng)前組件數(shù)的根實例如果當(dāng)前實例沒有父實例,此實例將會是其自己當(dāng)前實例的直接子組件。 vue實例 每個 Vue 應(yīng)用都是通過用 Vue 函數(shù)創(chuàng)建一個新的 Vue 實例開始的: var vm = new Vue({ // 選項 }) 當(dāng)創(chuàng)建一個 Vue 實例時,你可以傳入一個選項對象。作為參考,你也可以在 api/#選項-數(shù)據(jù) 文檔 中瀏覽完整的選...
摘要:此時還未有選項鉤子函數(shù)和間的生命周期完成后,會有一個判斷過程,判斷對象是否有選項。鉤子函數(shù)和鉤子函數(shù)間的生命周期當(dāng)發(fā)現(xiàn)中的數(shù)據(jù)發(fā)生了改變,會觸發(fā)對應(yīng)組件的重新渲染,先后調(diào)用和鉤子函數(shù)。和鉤子函數(shù)間的生命周期鉤子函數(shù)在實例銷毀之前調(diào)用。 vue生命周期 這是vue生命周期的圖示具體內(nèi)容:showImg(https://segmentfault.com/img/bV4xju?w=1200&...
摘要:指令指令帶有前綴,以表示它們是提供的特殊特性。添加事件偵聽器時使用模式。只當(dāng)事件是從偵聽器綁定的元素本身觸發(fā)時才觸發(fā)回調(diào)。差別在哪里將特性名轉(zhuǎn)換為從開始支持語法糖,會擴展成一個更新父組件綁定值的偵聽器。 vue指令 指令帶有前綴 v-,以表示它們是 Vue 提供的特殊特性。 v-text {{msg}} v-html //渲染HTML文本,更新元素的 innerHTML 。注意:內(nèi)...
閱讀 3474·2021-10-13 09:39
閱讀 1458·2021-10-08 10:05
閱讀 2259·2021-09-26 09:56
閱讀 2274·2021-09-03 10:28
閱讀 2672·2019-08-29 18:37
閱讀 2032·2019-08-29 17:07
閱讀 600·2019-08-29 16:23
閱讀 2190·2019-08-29 11:24