咱們平時在家是不多看電視的,最近看了幾期最強大腦,真的被震驚到了,爲何他們的大腦容量那麼大呢?而且很是機敏。海量的信息能夠在很短的時間內記住,真是最遙遠的距離莫過於我還沒弄明白題目,別人已經答案出來了。感受對他們來講,考上清華北大真是太容易了。我就想縱然我不能記住不少的信息,難道我認真些,努力些還不能記住幾行代碼嗎?javascript
言歸正傳,深刻 data 對象在官網上沒有完整的例子,可能對初學者真正透傳的理解是有些難度的,這裏展現data對象的完整例子。html
官網原文:vue
有一件事要注意:正如在模板語法中,v-bind:class 和 v-bind:style ,會被特別對待同樣,在 VNode 數據對象中,下列屬性名是級別最高的字段。該對象也容許你綁定普通的 HTML 特性,就像 DOM 屬性同樣,好比 innerHTML (這會取代 v-html 指令)java
{ // 和`v-bind:class`同樣的 API // 接收一個字符串、對象或字符串和對象組成的數組 'class': { foo: true, bar: false }, // 和`v-bind:style`同樣的 API // 接收一個字符串、對象或對象組成的數組 style: { color: 'red', fontSize: '14px' }, // 正常的 HTML 特性 attrs: { id: 'foo' }, // 組件 props props: { myProp: 'bar' }, // DOM 屬性 domProps: { innerHTML: 'baz' }, // 事件監聽器基於 `on` // 因此再也不支持如 `v-on:keyup.enter` 修飾器 // 須要手動匹配 keyCode。 on: { click: this.clickHandler }, // 僅對於組件,用於監聽原生事件,而不是組件內部使用 // `vm.$emit` 觸發的事件。 nativeOn: { click: this.nativeClickHandler }, // 自定義指令。注意,你沒法對 `binding` 中的 `oldValue` // 賦值,由於 Vue 已經自動爲你進行了同步。 directives: [ { name: 'my-custom-directive', value: '2', expression: '1 + 1', arg: 'foo', modifiers: { bar: true } } ], // 做用域插槽格式 // { name: props => VNode | Array<VNode> } scopedSlots: { default: props => createElement('span', props.text) }, // 若是組件是其餘組件的子組件,需爲插槽指定名稱 slot: 'name-of-slot', // 其餘特殊頂層屬性 key: 'myKey', ref: 'myRef' }
例1express
<body class=""> <div id="app"> <anchored-heading :level="2">hello world</anchored-heading> </div> <script src="js/vue.js"></script> <script> Vue.component("anchored-heading", { render: function(createElement) { return createElement("nav" + this.level, { 'class': { foo: true, bar: false }, style: { color: 'red', fontSize: '14px' }, attrs: { id: 'foo' }, props: { myProp: 'bar' //能夠傳給子組件的屬性 }, nativeOn: { click: this.nativeClickHander }, /* scopedSlots: { default: props => createElement("span", props.text) }*/ }, this.$slots.default) }, //props:["level"] 也能夠 props: { level: { type: Number, required: true, myProp: 'bar' } }, methods: { nativeClickHander: function() { alert("you click native Event") } } }) Vue.component("nav2", { props: ["myProp"], //template:`<h2>{{myProp}}</h2>` render: function(createElement) { return createElement("h2", [createElement("div", this.$slots.default), this.myProp]) } }) var app = new Vue({ el: "#app" }) </script> </body>
渲染函數最終渲染出來的div元素,其實跟template寫出的字符串模板同樣的
上例子anchored-heading組件定義了渲染函數(相似模板)和props屬性(level),level是接收父級傳遞過來的的值,其中渲染函數渲染出的也是一個組件(從"nav" + this.level能夠看出是nav2元素組件),爲nav2組件定義了class與props屬性,nav2的props{myProp: 'bar'}是用來傳遞myProp的值給它的子組件,class屬性是能夠從父級傳給子組件的,因此最終HTML渲染爲數組
<h2 class="foo"><div>hello world</div>bar</h2>
須要知道當你不使用slot屬性向組件中傳遞內容時,這些子元素被存儲在組件實例中的$slots.default中,本例中沒有使用slot屬性像子組件中傳遞內容,因此父組件的內容被存儲在this.$slots.default中app
例2:含有scopedSlots的例子dom
<body class=""> <div id="app"> <anchored-heading :level="2">hello world</anchored-heading> </div> <script src="js/vue-2.5.13.js"></script> <script> Vue.component("anchored-heading", { render: function(createElement) { return createElement("nav" + this.level, { scopedSlots:{ //default:props => createElement("span",props.text) default:function(props){ return createElement("span",props.text) } } }, this.$slots.default) }, //props:["level"] 也能夠 props: { level: { type: Number, required: true, myProp: 'bar' } }, }) Vue.component("nav2", { props: ["myProp"], render:function(createElement){ return createElement("h2",[createElement('b',[this.$scopedSlots.default({text:'我是組件'})]),createElement("div",this.$slots.default),this.myProp]) } }) var app = new Vue({ el: "#app" }) </script> </body>
渲染爲:ide
<body class=""> <div id="app"> <h2> <b><span>我是組件</span></b> <div>hello world</div> </h2> </div> </body>
例3:含有on和domProps的例子函數
<body class=""> <div id="app"> <anchored-heading :level="2"><div>hello world</div></anchored-heading> </div> <script src="js/vue.js"></script> <script> Vue.component("anchored-heading", { render: function(createElement) { return createElement("h" + this.level, { 'class': { foo: true, bar: false }, style:{ color:'red', fontSize:'14px' }, attrs:{ id:'foo' }, domProps:{ innerHTML:"BAZ" }, on:{ click:this.clickHander // on 與 nativeOn的區別是,nativeOn是加在組件上,它是父級還有字組件 }, //slot:"header" }, this.$slots.default) }, //props:["level"] 也能夠 props: { level: { type: Number, required: true, myProp: 'bar' } }, methods:{ clickHander:function(){ alert("you clicked me") } } }) var app = new Vue({ el: "#app" }) //domProps的優先級高,此時就再也不顯示this.$slots.default的內容 </script> </body>
渲染成:
<div id="app"><h2 id="foo" class="foo" style="color: red; font-size: 14px;">BAZ</h2></div>
例4:含有slot和ref的例子:
<body class=""> <div id="app"> <anchored-heading :level="2"><div slot="header">hello world</div></anchored-heading> </div> <script src="js/vue.js"></script> <script> Vue.component("anchored-heading", { render: function(createElement) { return createElement("h" + this.level, { slot:"header", ref:"myRef" }, this.$slots.header) }, //props:["level"] 也能夠 props: { level: { type: Number, required: true, myProp: 'bar' } }, methods:{ clickHander:function(){ console.log(this.$refs.myRef.innerHTML) } } }) var app = new Vue({ el: "#app" }) </script> </body>