/src/Demo.vue
子組件vue
<script>
export default {
props: ["msg"],
render() {
return (
<div>
<p>子組件</p>
<p>msg: {this.msg}</p>
</div>
);
}
};
</script>
複製代碼
/src/App.vue
父組件bash
<script>
import Demo from "./Demo";
export default {
data() {
return {
msg: "default"
};
},
render() {
return (
<div>
<p>父組件</p>
<hr />
<Demo msg={this.msg} />
</div>
);
}
};
</script>
複製代碼
使用JSX
編寫以後,你會發現以上對比之前的寫法,好像缺乏了components
這個配置項。 是的,JSX上你徹底不用配置compoents
,直接寫上去就行,這是我比較喜歡的app
以上簡單的參數傳遞(單向綁定)想必你們都能懂,但如何實現雙向綁定呢?ui
src/App.vue
父組件this
<script>
import Demo from "./Demo";
export default {
data() {
return {
msg: "default"
};
},
methods: {
handleOnInput(e) {
// 子組件 input的事件回調
// 實現 改變msg值
this.msg = e.target.value;
}
},
render() {
return (
<div>
<p>父組件</p>
<p>msg: {this.msg}</p>
<hr />
<Demo msg={this.msg} handleChange={this.handleOnInput} />
</div>
);
}
};
</script>
複製代碼
<Demo handleChange={ this.handleOnInput} />
spa
子組件的handleChange
props值與父組件 handleOnInput
綁定雙向綁定
/src/Demo.vue
子組件code
<script>
export default {
props: ["msg", "handleOnChange"],
render() {
return (
<div>
<p>子組件</p>
<p>msg: {this.msg}</p>
<!--onInput被觸發時,交由父組件事件處理-->
<input value={this.msg} onInput={this.handleChange} />
</div>
);
}
};
</script>
複製代碼
props:["handleOnChange"]
事件必需要配置component
<input onInput={this.handleChange} />
當輸入框觸發onInput
事件時,交由父組件的事件處理事件
其實JSX
雙向綁定就是從原生事件中獲取到值以後賦值到對應的變量中,從而達到v-model的效果
/src/components/HelloWorld.vue
export default {
render() {
return (
<div>Hello</div>
);
}
}
複製代碼
/src/Demo.vue
export default {
props: ["component"],
render(h) {
return (
<div>
<p>子組件</p>
<!--父組件傳入來的組件-->
{ h(this.component) }
</div>
);
}
}
複製代碼
/src/App.vue
import HelloWorld from './components/HelloWorld'
import Demo from './Demo'
export default {
render(h) {
return (
<div>
<p>父組件</p>
<!--向子組件傳入組件-->
<Demo component={HelloWorld} />
</div>
);
}
}
複製代碼
經過props
方式,把一個組件傳入到子組件中渲染
利用render(h)
的h
實現渲染
在JSX中,循環得使用array.map()的方式來
<script>
export default {
data() {
return {
data: [
{
title: 1
},
{
title: 2
}
]
};
},
render() {
return (
<div>
<ul>
{
this.data.map(item => {
return <li>{ item.title }</li>
})
}
</ul>
</div>
);
}
};
</script>
複製代碼
<script>
export default {
data() {
return {
isTrue: true,
};
},
render() {
const msg = this.isTrue ? '你中獎了' : '很遺憾,沒中'
return (
<div>
中獎狀況:{ msg }
</div>
);
}
};
</script>
複製代碼
<script>
export default {
data() {
return {
isTrue: true,
};
},
render() {
return (
<div>
中獎狀況:{ this.isTrue ? '好' : 'no' }
</div>
);
}
};
</script>
複製代碼
主要在標籤上 使用{...{}}
進行綁定
<script>
export default {
data() {
return {
backgroundColor: 'blue',
styleObject: {
backgroundColor: 'red',
fontSize: '20px',
color: '#fff'
}
};
},
render() {
return (
<div>
<span {...{
style: {
backgroundColor: this.backgroundColor
}
}}>我是藍色背景</span>
<span {...{
style: this.styleObject
}}>我是紅色背景</span>
</div>
);
}
};
</script>
複製代碼
<script>
export default {
data() {
return {
isBlue: true,
classOjbect: ['red']
};
},
render() {
return (
<div>
<span {...{
class: {
blue: this.isBlue,
}
}}>我是藍色背景</span>
<span {...{
class: this.classOjbect
}}>我是紅色背景</span>
</div>
);
}
};
</script>
<style>
.blue {
background: blue
}
.red {
background: red
}
</style>
複製代碼
經常使用的動態id
、data-*
賦值
<script>
export default {
data() {
return {
};
},
render() {
return (
<div>
<span {...{
attrs: {
'id': 'app',
'data-id': '1234'
}
}}>我是藍色背景</span>
</div>
);
}
};
</script>
複製代碼
結果: <span id="app" data-id="1234">我是藍色背景</span>