前言:

最近收到组长通知我们项目组后面新开的项目准备统一技术栈为react,目前我的情况是三大框架只会angular和Vue。在实际项目中只使用过一次angular5,其余项目都是使用Vue写的。写篇博客记录一下一些项目中经常使用的技巧在Vue和react中不同的实现方法。

使用JSX指定属性值和嵌入表达式:

(1)指定变量作为属性值

<div title={type}>type</div>    

Vue中的写法:

<div :title="type">type</div>  // vue写法

(2)指定字符串作为属性值

<div title="我是title的值"}>type</div>  

(3)动态绑定class

<div className={hasClass ? 'class' : ''}>class</div>
<div className={hasClass && 'class'}>class</div>

Vue中的写法:

<div :class="{'class': hasClass}"></div>   // Vue写法

(4)JSX中嵌入表达式

<div>{type}</div>

Vue中的写法:

<div>{{type}}</div>  // Vue写法

注意:react的 { } 中的变量是非常灵活的,可以为原始值、React 元素,或者函数。

状态(state)管理:

(1)定义变量

类似于Vue在data定义组件中的变量,react可以在constructor函数初试化定义组件中的变量。

class State  extends Component {
constructor(props){
super(props);
this.state = {
name: '你假装没察觉'
}
};
render() {
return (
<div>
{this.state.name}
</div>
)
}
}

在render函数中使用this.state就可以访问到在constructor中定义的this.state对象。PS:只能在constructor函数中对this.state对象进行初始化,在其他地方对this.state对象进行初始化都是无效的。

Vue的写法:

<div>{{name}}</div>

data() {
return {
name: '你假装没察觉'
};
} // Vue的写法

(2)改变变量的值

在react中如果要改变state中定义的变量不能直接使用 ' = '的方式直接赋值,需要使用setState函数。

this.setState({
name: 'yjj'
})

Vue中的写法:

this.name = 'yjj'   // Vue中的写法

注意:state的更新可能是异步的,如果存在 num = num + 10 这种情况,最好使用下面这种方式:

this.setState((prevState,props) => ({
num: prevState.num+10
}))

条件渲染:

(1)与运算符:

利用js的 '&&' 运算符当第一项为false时,第二项不会加载进来的机制。

render() {
const isShow = false
return(
<div>
{isShow&&<div>isShow为true时我才显示</div>}
</div>
)
}

(2) 三目运算符

render() {
const isShow = true
return(
<div>
{isShow?<div>isShow为true时我才显示</div>: <div>isShow为fasle时我才显示</div>}
</div>
)
}

Vue中的写法:

<div v-show="isShow">isShow为true时我才显示</div>
或者
<div v-if="isShow">isShow为true时我才显示</div>
// Vue中的写法

事件处理:

 (1)在constructor函数中使用bind将类的方法绑定上this。PS:这种方法太繁琐,需要将每个处理事件的方法都绑定上this

class Event extends Component {
constructor(props) {
super(props)
this.state = {
num: 10
}
this.add = this.add.bind(this)
};
add() {
this.setState((prevState) => ({
num: prevState.num+10
}))
};
render() {
return(
<div>
<div onClick={this.add}>num加10</div>
<div>当前num={this.state.num}</div>
</div>
)
}
}

(2)在回调函数中使用箭头函数。PS:需要多写一层箭头函数嵌套

<div onClick={(e)=>this.add(10,e)}>num加10</div>  // 10为传递进去的参数

(3)在onClick定义处直接使用bind绑定this。PS:需要多写一个bind

<div onClick={this.add.bind(this,10,e)}>num加10</div>  // 10为传递进去的参数

(4)定义方法时使用箭头函数。PS:当需要传递参数的时候还是只能在外面嵌套一层箭头函数

add = () => {
this.setState((prevState) => ({
num: prevState.num+10
}))
};
render() {
return(
<div>
<div onClick={this.add}>num加10</div>
<div>当前num={this.state.num}</div>
</div>
)
}

PS:在react中阻止默认行为不能像Vue中直接使用return false,只能使用e.preventDefault()

事件处理在Vue中的写法:

<div @click="add(10)">num加10</div>  // Vue中的写法,10为传递进去的参数

总结:

很多Vue项目中经常使用的技巧在react中都能找到类似的方法实现,区别只是在于写法不同而已。刚刚接触react不久,感觉很多地方都用着不是很顺手,总觉得还是Vue的写法要简单一些,等后面用react写几个项目再来总结一下Vue和react在实际项目中的差异。

react初探(一)之JSX、状态(state)管理、条件渲染、事件处理的更多相关文章

  1. Terraform状态State管理,让变更有记录

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...

  2. react 也就这么回事 02 —— JSX 插值表达式、条件渲染以及列表渲染

    我们已经学会了 React 创建元素和渲染元素 ReactDOM.render(<div>Hello React!</div>, document.getElementById ...

  3. React文档(八)条件渲染

    在React中,你可以创建不同的组件各自封装你需要的东西.之后你可以只渲染其中的一部分,这取决于应用的state(状态). 条件渲染在React里就和js里的条件语句一样.使用js里的if或者条件表达 ...

  4. React学习笔记(七)条件渲染

    React学习笔记(七) 六.条件渲染 使用if或条件运算符来创建表示当前状态的元素. 可以使用变量来存储元素.比如: let button = null; if (isLoggedIn) { but ...

  5. 【译】在React中实现条件渲染的7种方法

    原文地址:https://scotch.io/tutorials/7-ways-to-implement-conditional-rendering-in-react-applications 借助R ...

  6. React项目中使用Mobx状态管理(一)

    1.安装 $ yarn add mobx mobx-react 2.新建store/index.js,存放数据(以下思路仅限于父子组件的简单应用) 注意:这里暂时没使用装饰器@observable,装 ...

  7. React组件系统、props与状态(state)

     多个组件合成一个组件: var style = { fontSize: 20, color: '#ff0000' }; var WebSite = React.createClass({ rende ...

  8. React 初探

    React 简单介绍 先说 React 与 React Native 他们是真的亲戚,可不像 Java 和 Javascript 一样. 其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法 ...

  9. react初探(二)之父子组件通信、封装公共组件

    一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么 ...

随机推荐

  1. 做一个有产品思维的研发:部署(Tomcat配置,Nginx配置,JDK配置)

    每天10分钟,解决一个研发问题. 如果你想了解我在做什么,请看<做一个有产品思维的研发:课程大纲>传送门:https://www.cnblogs.com/hunttown/p/104909 ...

  2. Linux进程PRI与NI值

    1.PRI -> 进程的优先级,大部分系统(Linux.UCOSII)都是数字越低优先级越高,进程就优先运行 , Linux中的PRI(new) = PRI(old) + nice ,其中 , ...

  3. HDU 1520 树形DP入门

    HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...

  4. 【Python学习】iterator 迭代器小练习

    http://anandology.com/python-practice-book/iterators.html  Problem 1: Write an iterator class revers ...

  5. CentOS 7 扩大/root分区

    Linux 根目录爆满解决 亲测有效!转载自https://blog.csdn.net/e_wsq/article/details/79531493 CentOS 7 调整 home分区扩大 root ...

  6. 关于MySQL中的自联结的通俗理解

    关于MySQL中的自联结的通俗理解 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有表格的代码都是来自SQL必知 ...

  7. Winform 图片预览列表+分页显示

    针对图片列表展示信息,一开始没有做过相关类似的功能,大多都是以表格行显示为主,所以刚开始实现这个功能的时候是懵逼的.无从下口.在网上搜索一时半会也没找到合适的解决方案.大致就是类似于下图这样,每条数据 ...

  8. Saiku资源帖

    一.精选 1.李秋 随笔分类 - pentaho 二.概述 1.Saiku + Kylin 多维分析平台探索 三.Saiku+Kylin 1.使用Saiku+Kylin构建多维分析OLAP平台 2.使 ...

  9. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  10. Arrays工具类

    1.Arrays工具类针对数组进行操作的工具类 提供了排序查找等功能 2.方法: Arrays.toString(int[] a) 将数据转换成字符串 Arrays.sort(int[] a) 将数组 ...