jsx怎么往js里传参数_在vue中使用jsx语法的使用方法

什么是JSX?

JSX就是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到

我为什么要在vue中用JSX?

想折腾一下呗,开玩笑.最开始是因为近期在学习react,在里面体验了一把jsx语法,发现也并没有别人说的很难受的感觉啊,于是就想尝试在vue中也试下,废话不多说,先来用代码来看下两者的区别吧.

ps:vue中大部分场景是不需要用render函数的,还是用模板更简洁直观.

使用template

// item.vue

export default {

name: "item",

props:{

id:{

type:Number,

default:1

}

}

}

item组件中就是接收父组件传过来的id值来显示不同的h标签,v-if可以说用到了"极致",而且写了很多个冗余的slot

使用render函数和jsx

// item.vue

export default {

name: "item",

props:{

id:{

type:Number,

default:1

}

},

render(){

const hText=`

${this.$slots.default[0].text}

`

return

}

}

再加上父组件来控制props的值。父组件不做对比还用传统的template格式,

// list.vue

Hello World

下一个

import Title from './item'

export default {

name: "list",

data() {

return {

id:1

}

},

components: {

"h-title":Title

},

methods:{

next(){

++this.id

}

}

}

运行后页面就渲染出了h1 or h2 or h3标签,同时slot也只有一个,点击切换props的值,也会显示不同的h标签。第二种写法虽然不是很直接,但是省去了很多冗余代码,页面一下清爽了很多。

没了v-if,v-for,v-model怎么办?

不要着急,这些指令只是黑魔法,用js很容易实现。

v-if

render(){

return (

{this.show?'你帅':'你丑'}

)

}

写三元表达式只能写简单的,那么复杂的还得用if/else

render(){

let ifText

if(this.show){

ifText=

你帅

}else{

ifText=

你丑

}

return (

{ifText}

)

}

v-for

data(){

return{

show:false,

list:[1,2,3,4]

}

},

render(){

return (

{this.list.map((v)=>{

return

{v}

})}

)

}

在jsx中{}中间是没办法写if/for语句的只能写表达式,所以就用map来当循环,用三元表达式来当判断了

v-model

最近在帮公司面试招人发现v-model很多人都不知道语法糖是什么?然后有些人说我可以用原生js实现,但是他们竟然不知道在vue中怎么实现,好吧,两个点:传值和监听事件改变值。

export default {

name: "item",

data(){

return{

show:false,

list:[1,2,3,4],

text:'',

}

},

methods:{

input(e){

this.text=e.target.value

}

},

render(){

return (

{this.text}

)

}

}

怎么用自定义组件?

很简单,只需要导入进来,不用再在components属性声明了,直接写在jsx中比如

import HelloWolrd from './HelloWorld'

export default {

name: "item",

render(){

return (

)

}

}

事件,class,style,ref等等怎么绑定?

来看下面的写法

render (h) {

return (

// normal attributes or component props.

id="foo"

// DOM properties are prefixed with `domProps`

domPropsInnerHTML="bar"

// event listeners are prefixed with `on` or `nativeOn`

onClick={this.clickHandler}

nativeOnClick={this.nativeClickHandler}

// other special top-level properties

class={{ foo: true, bar: false }}

style={{ color: 'red', fontSize: '14px' }}

key="key"

ref="ref"

// assign the `ref` is used on elements/components with v-for

refInFor

slot="slot">

)

}

上面有个地方需要注意,当给自定义组件绑定事件时用nativeOnClick,而模板格式是用

@click.native,另外当用到给函数式组件绑定事件时就有点小坑了下面说。

JSX中的函数式组件

函数式组件无状态,无this实例,下面是vue文档中提到的一段话:

因为函数式组件只是一个函数,所以渲染开销也低很多。然而,对持久化实例的缺乏也意味着函数式组件不会出现在 Vue devtools 的组件树里。

我个人理解因为没了状态(data),少了很多响应式的处理,还有生命周期等过程会提高速度和减少内存占用吧?

函数式组件也可以在模板格式中用只需要这样

那jsx中的函数式组件呢?也很简单只需增加配置functional: true就可以了

那函数式组件没有了this 实例怎么绑定事件怎么获取props呢?

组件需要的一切都是通过上下文传递,包括:

props : 提供所有 prop 的对象

children: VNode 子节点的数组

slots: 返回所有插槽的对象的函数

data:传递给组件的数据对象,并将这个组件作为第二个参数传入 createElement

上面我只列举了部分属性,这些是非函数式组件的东西,对于函数式组件

vue 增加了context对象,需要作为render(h,context) 第二个参数传入,this.$slots.default更新为context.children props原本是直接挂在this上的,现在变为context.props挂在了context.props上。this.data变为了context.data

需要注意的是对于函数式组件,没有被定义为prop的特性不会自动添加到组件的根元素上,意思就是需要我们手动添加到组件根元素了,看个例子吧

//父组件

...省略无关代码

render(){

return (

)

}

//Item.vue组件

export default {

functional:true,

name: "item",

render(h,context){

return (

{context.props.data}

)

}

}

上面代码期待的是.large类名传入到了Item的根元素上,但是其实没有。我们需要增加点东西

// Item.vue

export default {

functional:true,

name: "item",

render(h,context){

return (

{context.props.data}

)

}

}

注意到,通过展开运算符把所有的属性添加到了根元素上,这个context.data就是你在父组件给子组件增加的属性,他会跟你在子元素根元素的属性智能合并,现在.large类名就传进来了。这个很有用,当你在父组件给子组件绑定事件时就需要这个了。下面说一个关于绑定事件的小坑

向 createElement 通过传入 context.data 作为第二个参数,我们就把 my-functional-button 上面所有的特性和事件监听器都传递下去了。事实上这是非常透明的,那些事件甚至并不要求 .native 修饰符

上面是vue官网的一段话,然而我看了一遍就忽略了一句很重要的话,就是最后一句,他说不需要.native修饰符了?好先看代码

// 父组件

methods:{

show(){

alert('你好')

}

},

render(){

return (

)

}

上面代码乍一看没毛病,自定义组件用onNativeClick嘛,结果就是不会弹窗。唉,最后读了几遍刚才vue文档中的解释,才发现原来函数式组件不需要.native修饰符,对于template格式肯定一下就反应过来了,但是jsx的话,好吧,把上面的onNativeClick重新改为onClick就好了。

现有项目哪些功能可以用jsx代替呢?

这个其实跟最开始我例举的例子很像。我在项目中用它来干掉了满屏的v-if/v-else

由于我的业务是pad上的,需求是一套试卷有几十道题目,要求一屏只显示一道题目,点击下一题显示下一个题,思路也比较简单:

用一个num变量表示当前正在展示的题目索引

每次点击下一题按钮时num++

用v-if来判断 num===1,num===2这样来决定展示哪个。

这一写,模板里面好多啊,由于我们的题目每道题的模板可能都不一样,所以没办法循环,只能手写全部。之前考虑过用动态组件来切换,但是放弃了,因为没有if直观啊。

下面看怎么用jsx优化一下

//父组件

export default {

name: "list",

data() {

return {

data:'我是函数式组件',

id:1,

tests:{

1:

第一道题
,

2:

第二道题
,

3:

第三道题

}

}

},

methods:{

next(){

++this.id

}

},

render(){

return (

下一题

)

}

}

上面每道题目的结构都不一致

//子组件,只接受数据展示,用函数式组件

export default {

functional:true,

name: "item",

render(h,context){

return (

{context.props.data}

)

}

}

上面没有用任何if/else判断就完成了功能,这里用jsx我觉得比较合适,不知道各位大佬有什么其他思路?

最后

总结一下吧,我们平时开发还是多用temlate因为直观简洁,各种指令用着很方便,等你觉得用template写出的代码看着很冗余,或者想自己控制渲染逻辑比如循环,判断等等时可以考虑用JSX。另外推荐大家多用函数式组件提高性能。

第一次写文章,希望各位花时间看了的大佬觉得哪个说的不太严谨还需多多包涵,提出意见我都接受。

参考资料

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何对数据库中的表以及表中的字段进行重命名

貌似没有直接的SQL语句可以做到这一点,除非删除再加。。。 SQL SERVER 中提供了存储过程:SP_RENAME 对表进行重命名: 更多详见:https://msdn.microsoft.com/zh-cn/library/ms188351.aspx转载于:https://www.cnblogs.com/xwgli/p/4…

系统优化-----sysctl.conf文件内核设置参数详解

摘自https://blog.csdn.net/tallercc/article/details/52823075 sysctl.conf工作原理 sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/IP堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员…

How Tomcat works — 一、怎样阅读源码

在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法。一直想阅读一些开源项目,可是没有合适的机会开始。最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的session本身就支持,发现自己…

linux c字符连接,C 语言实例

指针方法:#include int main(){char str1[100], str2[100], *p str1,n 0;printf("请输入第一个字符串:");scanf("%s", str1);printf("请输入第二个字符串:");scanf("%s", str2);while (*p ! \0);/*移动指针到str1尾*/--p…

plot画分段函数_python画图函数大全

很多时候,我们需要用python画图,这样就可以更加直观的看到数据的走势,而不是干巴巴的数字。今天,我们就给大家整理了一下python画图的常用函数,由于篇幅限制。无法将这些函数的使用方法全部表现出来。所以,…

BZOJ 2145 悄悄话

悄悄话 写的筋疲力尽,从下午8点开始写,现在已经一点半了。 主要就是一个暴力,然后加上算权值。用单词词频来搞。 但是第10个测试点 Madam, Im Adam.出事了,因为我有符号还是会把单词分开,然后无法识别Im 最后强行面向数…

第9章 使用ssh服务管理远程主机。

章节简述: 学习使用nmtui命令配置网卡参数、手工将多块网卡做绑定、使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态。 完整演示sshd服务配置方法并详细讲述每个参数的作用,实战基于密钥远程登陆实验以及用screen服务让远程会话不再终断。 本…

enum不能被继承

1、枚举类介绍 如果一个类的实例是有限且确定的,那么可以使用枚举类。比如:季节类,只有春夏秋冬四个实例。 枚举类使用enum进行创建,其实例必须从”第一行“开始显示写出。 enum Season{SPRING,SUMMER,FALL,WINTER;//默认public s…

linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由

问题/发现:本人在为一款路由器写一个统计局域网互传流量的Linux内核模块的时候,发现如下问题:局域网内的一台设备和该局域网内另一台设备进行通信时,我在路由器的netfilter链表处设下钩子,以捕获数据。后来发现这些数据…

kali linux 升级命令_作为高级Java,你应该了解的Linux知识

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。作为一个javaer,我以前写过很多关于Linux的文章。但经过多年的观察,发现其实对于大部分人,有些东西压根就用不着。用的最多的&…

arn linux编译系统时错误的解决

今天打算编译支持orange pi开发板的Raspbain Jessie系统 从github上拿下源码,下载,编译,一直比较顺利 结果在编译一半的时候报错: /second-stage: line 206: /bin/sleep: cannot execute binary file: Exec format error 根据错误提示信息,找到了该语句如下: while kill -0 $1 …

【进出理论】投入与收益

笔者对网游相当无感,再加上以前玩过不少游戏。对现在的游戏没有多大的吸引力,倒是对爱情有所感性,及当代IT技术的发展。许多以前无法获取的东西,现在在网络寻找各种方式,或者若干想通了什么,就总可以获取到…

CSS笔记1

在divcss开发的时候,特别是新手特别喜欢追求完美,所以开发中或开发完后立即去验证开发的css是否符合w3c标准。虽然说验证w3c是好事但是,这个不是最重要的,最重要的是div css的兼容浏览器性能、css代码最优程度、特效兼容。 CSS扩展…

linux centos 光盘修复,CentOS7删除/boot/initramfsxxx.img并尝试光盘救援模式修复

CentOS7删除/boot/initramfsxxx.img并尝试光盘救援模式修复一、删除/boot/initramfs-3.10.0-957.el7.x86_64.img[rootswitch ~]# rm -f /boot/initramfs-3.10.0-957.el7.x86_64.img二、重启起不来三、插入光盘,进入修复模式(VMWare开机按esc)四、选择修复CentOS7系统…

django 模板两次for循环_Django模板之基本的 for 循环 和 List内容的显示方式

Django模板之基本的 for 循环 和 List内容的显示方式发布时间:2020-08-31 07:29:20来源:脚本之家阅读:116工程结构views.pydef home(request):TutorialList ["HTML", "CSS", "jQuery", "Python", &…

I/O多路转接之poll,epoll

1、poll函数原型&#xff1a;#include <poll.h>int poll(struct pollfd fds[], nfds_t nfds, int timeout)&#xff1b;参数说明:fds&#xff1a;是一个struct pollfd结构类型的数组&#xff0c;用于存放需要检测其状态的Socket描述符&#xff1b;每当调用这个函数之后&a…

amh在linux下修改伪静态,伪静态规则大全 - AMH云主机面板 - AMH开源社区 - amh.sh

1、WordPress伪静态if (-f $request_filename/index.html){rewrite (.*) $1/index.html break;}if (-f $request_filename/index.php){rewrite (.*) $1/index.php;}if (!-f $request_filename){rewrite (.*) /index.php;}2、PHPCMS伪静态rewrite ^/caipu-([0-9])-([0-9])-([0-9…

pn532写入手机nfc_NFC手机手环脱机模拟加密门禁卡,你get了吗?

目标&#xff1a;将门禁卡、考勤卡、会员卡、停车卡、电梯卡等等各种卡模拟进手机里&#xff0c;模拟后可用手机代替刷卡&#xff0c;无需root&#xff0c;不用电脑背景介绍&#xff1a;前言目前&#xff0c;IC卡已被广泛应用于身份识别、金融消费、安全认证等领域。大多数人每…

世纪互联云和华为共同打造的数据中心是一个很好的一步标志!

9月4日&#xff0c;华为公布高端智能手机Mate7&#xff08;2999元人民币&#xff09;&#xff0c;当中的处理器&#xff08;CPU&#xff09;是华为自产的海思麒麟&#xff08;Kirrin&#xff09;925&#xff0c;此举让高调国产操作系统者颜面丢尽&#xff0c;国家队无言以对。 …

linux安装vim plug, vim-plug 的安装和使用

正确安装 vim-plug之前写了一篇&#x1f984; 一篇文章讲清楚如何安装vim插件&#xff0c;见各位童鞋留言说 vim-plug 更好用。果然各种插件方便管理&#xff0c;安装也很简单。下面简单说下 vim-plug 的操作基本姿势&#xff1a;安装 vim-plugvim-plug 是一个 vim 的插件管理插…