摘要:更推薦用和實現父子組件通信創建實例此時打印出組件繼承使用基礎構造器,創建一個子類。包含組件選項的對象創建構造器創建實例,并掛載到一個元素上。該對象包含可注入其子孫的屬性。和綁定并不是可響應的。
關于組件名:
*組件名可以是kebab-case (短橫線分隔命名)或者PascalCase (駝峰式命名) 當使用 kebab-case (短橫線分隔命名) 定義一個組件時,你也必須在引用這個自定義元素時使用 kebab-case當使用 PascalCase (駝峰式命名) 定義一個組件時,你在引用這個自定義元素時兩種命名法都可以使用。*
//在注冊之后可以用在任何新創建的 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: `這是一個局部的自定義組件,只能在當前Vue實例中使用 hello`,
當我們定義這個 組件時,你可能會發現它的 data 并不是像這樣直接提供一個對象:
data: { count: 0 }
取而代之的是,一個組件的 data 選項必須是一個函數,因此每個實例可以維護一份被返回對象的獨立的拷貝:
data: function () { return { count: 0 } }
如果 Vue 沒有這條規則,所有模板都會共享一份數據。
有些 HTML 元素,諸如
這會導致我們使用這些有約束條件的元素時遇到一些問題。例如:
這個自定義組件 會被作為無效的內容提升到外部,并導致最終渲染結果出錯。幸好這個特殊的 is 特性給了我們一個變通的辦法:
需要注意的是如果我們從以下來源使用模板的話,這條限制是不存在的:
字符串 (例如:template: "...")單文件組件 (.vue)
Prop 類型
//普通類型 props: ["title", "likes", "isPublished", "commentIds", "author"]
//指定類型 props: { title: String, likes: Number, isPublished: Boolean, commentIds: Array, author: Object }
單項數據流,傳遞過后不能修改有兩種常見的試圖改變一個 prop 的情形:
//這個 prop 用來傳遞一個初始值;這個子組件接下來希望將其作為一個本地的 prop 數據來使用。 props: ["initialCounter"], data: function () { return { counter: this.initialCounter } }
//這個 prop 以一種原始的值傳入且需要進行轉換 props: ["size"], computed: { normalizedSize: function () { return this.size.trim().toLowerCase() } }
Vue.component("my-component", { 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 ["success", "warning", "danger"].indexOf(value) !== -1 } } } })
類型:Vue instance
詳細:
指定已創建的實例之父實例,在兩者之間建立父子關系。子實例可以用 this.$parent 訪問父實例,子實例被推入父實例的 $children 數組中。
//定義一個父組件 const parent = new Vue({ name: "parent" }) //定義一個組件 const componet2 = { data () { return { text: 1 } }, mounted () { console.log(this.$parent.$options.name) //打印Root this.$parent.text = 1234; //也可以修改,節制地使用 $parent 和 $children - 它們的主要目的是作為訪問組件的應急方法。更推薦用 props 和 events 實現父子組件通信 } } //創建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 )使用基礎 Vue 構造器,創建一個“子類”。參數是一個包含組件選項的對象。
//包含組件選項的對象 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") } } } // 創建構造器 const CompVue = Vue.extend(compoent) // 創建 CompVue實例,并掛載到一個元素上。 new CompVue({ el: "#root", propsData: { //傳遞props屬性 propOne: "xxx" }, data: { //可以覆蓋或者合并 text: "123" }, mounted () { //不會覆蓋 ,都會被調用 console.log("instance mounted") } })
// 1定義一個組件對象 const component = { props: ["value"], template: ` //綁定傳遞過來的value `, methods: { //向父組件觸發事件 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。默認情況下,一個組件上的 v-model 會把 value 用作 prop 且把 input 用作 event,但是一些輸入類型比如單選框和復選框按鈕可能想使用 value prop 來達到不同的目的。使用 model 選項可以回避這些情況產生的沖突。
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(有一定難度,學習成本較大) 2.發布訂閱模式(總線機制,Bus)
Document
const component = { template: ` //vue的默認組件,放置插槽的地方 `, 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 //傳遞插槽內容 ` })
有些時候我們需要多個插槽,可以進行命名;
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 ///向指定的內容 this is body ` })
可以在 標簽內部指定默認的內容來做到這一點。
Submit
如果父組件為這個插槽提供了內容,則默認的內容會被替換掉。
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 () { console.log(this.$refs.comp.value, this.$refs.span) //打印出組件實例和HTML標簽 }, template: ` {{value}} //此時沒有作用域,訪問到的不是組件內的value,而是外部的value //添加作用域,組件內部傳遞的數據都保存在props對象中 {{props.value}} ` })
Document change
這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在起上下游關系成立的時間里始終生效。
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) //上上一級,接受到的數據,打印出上上一級的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一樣,可以調用相應的值,是一個對象或返回一個對象的函數。該對象包含可注入其子孫的屬性。 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 綁定并不是可響應的。這是刻意為之的。provide 和 inject 綁定并不是可響應的。這是刻意為之的。
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一樣,可以調用相應的值 const data = {} // es5雙向綁定實現原理 Object.defineProperty(data, "value", { get: () => this.value, //獲取最新value,每次調用value相當于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 主要為高階插件/組件庫提供用例。并不推薦直接用于應用程序代碼中。
參考:渲染函數&JSX
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96843.html
摘要:更推薦用和實現父子組件通信創建實例此時打印出組件繼承使用基礎構造器,創建一個子類。包含組件選項的對象創建構造器創建實例,并掛載到一個元素上。該對象包含可注入其子孫的屬性。和綁定并不是可響應的。 組件注冊 關于組件名: *組件名可以是kebab-case (短橫線分隔命名)或者PascalCase (駝峰式命名) 當使用 kebab-case (短橫線分隔命名) 定義一個組件時,你也必...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:就是實例中的對象當前組件接收到的對象。當前組件數的根實例如果當前實例沒有父實例,此實例將會是其自己當前實例的直接子組件。 vue實例 每個 Vue 應用都是通過用 Vue 函數創建一個新的 Vue 實例開始的: var vm = new Vue({ // 選項 }) 當創建一個 Vue 實例時,你可以傳入一個選項對象。作為參考,你也可以在 api/#選項-數據 文檔 中瀏覽完整的選...
摘要:此時還未有選項鉤子函數和間的生命周期完成后,會有一個判斷過程,判斷對象是否有選項。鉤子函數和鉤子函數間的生命周期當發現中的數據發生了改變,會觸發對應組件的重新渲染,先后調用和鉤子函數。和鉤子函數間的生命周期鉤子函數在實例銷毀之前調用。 vue生命周期 這是vue生命周期的圖示具體內容:showImg(https://segmentfault.com/img/bV4xju?w=1200&...
摘要:指令指令帶有前綴,以表示它們是提供的特殊特性。添加事件偵聽器時使用模式。只當事件是從偵聽器綁定的元素本身觸發時才觸發回調。差別在哪里將特性名轉換為從開始支持語法糖,會擴展成一個更新父組件綁定值的偵聽器。 vue指令 指令帶有前綴 v-,以表示它們是 Vue 提供的特殊特性。 v-text {{msg}} v-html //渲染HTML文本,更新元素的 innerHTML 。注意:內...
閱讀 2181·2021-11-19 09:55
閱讀 2637·2021-11-11 16:55
閱讀 3175·2021-09-28 09:36
閱讀 1945·2021-09-22 16:05
閱讀 3272·2019-08-30 15:53
閱讀 1806·2019-08-30 15:44
閱讀 2899·2019-08-29 13:10
閱讀 1339·2019-08-29 12:30