Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • CSS

  • JavaScript

  • 工具

  • Vue

    • vue批量引入组件
    • vue中watch用法
    • vue使用基础JSX语法
      • vue首页白屏
      • vue长列表优化
      • 模板文件中script、template、style存在必要性
      • popup弹窗组件
      • 使用$mount和extend扩展vue
      • 扩展toast合并popup(按需加载)
      • canvas实现弧形进度条
      • vue中使用CSS Modules
      • vue实现无限轮播图
      • vue半圆形菜单
      • 纯CSS实现圆形进度条
      • v-model简单实现
      • vue带箭头下拉框
      • vue事件修饰符
      • vue鼠标悬浮显示提示文字
      • vue添加发布版本号方法
      • vue配置全局样式文件
      • vue在env development中设置全局变量不生效
      • vue引入less或scss全局变量
      • vue中使用Keepalive
      • vue2为什么只支持一个根节点
      • vue打包优化分析工具—webpack-bundle-analyzer
      • vue使用echarts(按需加载)
      • echarts柱形图重合堆叠
      • vue使用draggable实现多列拖拽(解决空列不能拖拽问题)
      • vue禁止三方库打包到bundle中
      • npm run serve运行背后的思考
      • vxe-table树结构不允许insert
      • vue组件延迟加载
      • 多页面应用配置
      • vue项目常用优化
      • vue实现拖动拼图验证码
      • vue虚拟dom
      • canvas心形动画
      • canvas绘制玫瑰曲线
      • element表单validateField验证部分字段
      • element日期选择限制今天以后并精确到小时
      • 前端使用JSEncrypt和node-rsa进行rsa加密传输和接收解密
      • elementui日期选择器生日只选择月和日不选择年并隐藏年份
      • el-upload组件第二次点击手动submit时不生效
      • element表单内输入框使用@keyup enter native回车时会刷新页面
    • antdv踩坑记录

    • Vue3

    • 前端
    • Vue
    kros
    2020-11-20

    vue使用JSX语法

    如果你使用过react技术那不用担心,在vue里面使用JSX是差不多的。vue在大多数情况都是使用模板来创建页面,很少会有使用完全js编程,只有在大型项目或插件中使用。 如果你真的需要js来编写界面,vue提供一个render函数,与生命周期同级写法如下:

    created(){
    	
    },
    render(createElement){
    	
    }
    
    1
    2
    3
    4
    5
    6

    render函数提供一个createElement方法,我们可以通过它来产生虚拟dom 。 如下:使用该方法创建了一个div容器,容器内有两个元素img和span,我们可以通过这种嵌套的功能实现html模板。为了避免和标签style和class冲突,渲染函数中使用staticStyle和staticClass替换。

    render(create){
    	return create('div', {
    		staticStyle: {
    			width: "400px",
    			height: "400px"
    		},
    		staticClass: "box"
    		on: {
    			click: function(e){
    				//dosomething
    			}
    		},
    		[{
    			'img',
    			{
    				staticClass: 'img-bg',
    				attrs: {
    					src: 'url'
    				}
    			}
    		},{
    			'span',
    			{
    				staticClass: 'title',
    			}
    		}]
    	})
    }
    <style lang="scss">
    	.box {
    		
    	}
    	.img-bg {
    		
    	}
    	.title {
    		
    	}
    </style>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39

    这样的写法有个严重的问题:篇幅太长、不利于编写代码。于是就有了JSX,它是一种js的扩展语法。可参考React JSX 简单来说就是()内是html、{}内是JavaScript、js代码外层必须有html组件。下面介绍几种模板中的常规用法

    return (
    	<div class="box" style="width: 400px;height: 400px">
    		<img src="url" class="img-bg">
    		<span class="title"></span>
    	</div>
    );
    
    1
    2
    3
    4
    5
    6

    # 组件使用

    在render中使用组件跟在模板中使用是一样的,传递参数也没有变化。如下:

    import comText from './com-text.vue'
    ...
    
    components: {comText}
    
    ...
    
    render(c){
    	return (
    		<comText text="123456"></comText>
    	)
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    # 样式、属性、事件绑定

    绑定都通过单花括号

    <div class="img-container" style={this.imgConStyle} onMouseover={this.mouseover}>
    	{
    		this.imgList.map(img => {
    			return <img src={img} class="img" onTouchstart={this.touchstart} onTouchend={this.touchend}/>
    		})
    	}
    </div>
    
    1
    2
    3
    4
    5
    6
    7

    # v-if、v-for

    在jsx没有v-if和v-for。要实现v-if可以通过三目运算符,实现v-for可以通过map,你也可以通过createElement函数中传递指令来实现。

    <div class="tabs">
    	{
    		this.tabs.map((tab, index) => {
    			return <div class={index == this.current ? 'tab-on tab-item' : 'tab-off tab-item'} onClick={() => {this.clickTab(index)}}><span>{tab.name}</span></div>
    		})
    	}
    	<div style={this.sliderStyle}></div>
    </div>
    <!-- 指令 -->
    createElement('div', {
    	directives: [{
    			name:"show",
    			rawName:"v-show",
    			value:true
    		}]
    },[])
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    提示

    仅支持h5项目,小程序和app不会识别render函数

    代码示例

    #vue
    上次更新: 2025/09/05, 8:09:00
    vue中watch用法
    vue首页白屏

    ← vue中watch用法 vue首页白屏→

    最近更新
    01
    Find the next perfect square
    09-05
    02
    Regex validate PIN code
    09-05
    03
    Find the odd int
    09-05
    更多文章>
    Theme by Vdoing | Copyright © 2020-2025 kros king
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev