相关文章推荐
淡定的登山鞋  ·  佳能1500D(单机)_百度百科·  1 周前    · 
要出家的吐司  ·  《五菱宏光》MINIEV ...·  2 月前    · 
活泼的砖头  ·  Nightwish Miwish ...·  3 月前    · 
近视的豆浆  ·  年,中文系被国家教委批准为全国首批文科基础学 ...·  1 年前    · 
想出国的钱包  ·  《王者荣耀》钻石算什么水平呢? - 知乎·  1 年前    · 
小百科  ›  vue render jsx 事件绑定 条件渲染 slots 插槽开发者社区
jsx vue
爱笑的茶壶
2 年前
作者头像
yangdongnan
0 篇文章

vue render jsx 事件绑定 条件渲染 slots 插槽

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 日常记录 > vue render jsx 事件绑定 条件渲染 slots 插槽

vue render jsx 事件绑定 条件渲染 slots 插槽

作者头像
yangdongnan
发布 于 2019-04-27 21:01:32
6.5K 0
发布 于 2019-04-27 21:01:32
举报
前文
  • vue中使用 render写一些展示组件
  • 通过实现一个简单的单元 cell 组件, 来了解render jsx 在vue的使用
  • 将 h 作为 createElement 的别名是 Vue 生态系统中的一个通用惯例,实际上也是 JSX 所要求的。从 Vue 的 Babel 插件的 3.4.0 版本开始,我们会在以 ES2015 语法声明的含有 JSX 的任何方法和 getter 中 (不是函数或箭头函数中) 自动注入 const h = this.$createElement,这样你就可以去掉 (h) 参数了。对于更早版本的插件,如果 h 在当前作用域中不可用,应用会抛错。
 render(){
	return (
		<div><div>
}
jsx 中 使用 if else 条件判断
  • { } 中判断一个条件是否为真
<div class={'e-cell--right'} on-click={change.bind(this)}>
						check
							? <span class={'e-cell-icon'}></span>
				</div>

ps : check 为真时的效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
绑定事件
  • jsx 中绑定事件 可以写原生的事件名 如 onClick 驼峰式 也可以用 ’ - ’ 短线相连 如下
  • 通过 [ event.name ].bind(this) 绑定事件
<div class={'e-cell--right'} on-click={change.bind(this)}>
						check
							? <span class={'e-cell-icon'}></span>
				</div>
在render 中使用 slot 插槽
  • this.$slots.default 可以获取 slot 传递的内容, vnode
  • 通过 vue中 vnode h() 来渲染
  • 插槽中的元素 可以使用组件的样式命名 或是定义 指定子级样式 使用 * 定义样式
render(h){ 
		const {label, value, check, change}  = this
		return (
			<div class={'e-cell'}>
				<div class={'e-cell--content'}>
					<span class={'e-cell--label'}>{label}</span>
						this.$slots.default
							? h('i', this.$slots.default)
							: <div class={'e-cell--value'}>{value}</div>
//  less
.e-cell--content{
	.e-cell--label{
		display: inline-block;
		width: 120px;
		font-size:28px;
		font-family:PingFangSC-Regular;
		font-weight:400;
		color:rgba(51,51,51,1);
		line-height:40px;
	.e-cell--value,*{ //关于插槽样式
		font-style: normal;
		font-size:24px;
		font-family:PingFangSC-Regular;
		font-weight:400;
		color:rgba(51,51,51,1);
		line-height:40px;
}
完整代码
//cell组件的样式
import './cell.less'
export default {
	name:'ECell',
	//允许传入的参数
	props:{
		label:{
			type:String,
			default:'T'
		value:{
			type:String,
			default:'(T (共2888点,抵20元))'
	data(){
		return {
			check:false,
	//绑定一个事件, 通知是否被点击
	methods:{
		change(){
			this.check = !this.check
			this.$emit('change', {evt:this.label, select: this.check})
	// render  vue官方对 h 的描述 这是一个约定
	render(h){ 
		const {label, value, check, change}  = this
		return (
			<div class={'e-cell'}>
				<div class={'e-cell--content'}>
					<span class={'e-cell--label'}>{label}</span>
						this.$slots.default
							? h('i', this.$slots.default)
							: <div class={'e-cell--value'}>{value}</div>
				<div class={'e-cell--right'} on-click={change.bind(this)}>
						check
							? <span class={'e-cell-icon'}></span>
}
ps: 使用 cell 组件
//局部
	import ECell from '../../lib/cell'
	components:{ECell},
  • value 绑定 和 slot 使用1种即可
	<ECell ref="cake"
 
推荐文章
淡定的登山鞋  ·  佳能1500D(单机)_百度百科
1 周前
要出家的吐司  ·  《五菱宏光》MINIEV 來台銷售別意外《上汽通用五菱》在台註冊大量 ...
2 月前
活泼的砖头  ·  Nightwish Miwish GSCC-L 面單奧古曼雲杉面板41吋民謠吉他
3 月前
近视的豆浆  ·  年,中文系被国家教委批准为全国首批文科基础学科人才培养和科学 ...
1 年前
想出国的钱包  ·  《王者荣耀》钻石算什么水平呢? - 知乎
1 年前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南