React碰到v-if
最近在重构公司老项目,由于本人以前的技术栈是vue, 换工作后发现现在公司的技术栈是react, 所以重构的过程是及其痛苦。加之项目又是几年前的老项目,不敢大改,比葫芦画瓢比比皆是。本文就介绍下遇到的一个常用的痛点。欢迎大佬指正。
废话不多说,直接上一段代码。
import React from 'react'
const App = () => {
const record = {
toKe: true, // 贝壳首页
toSecondHand: true, // 二手房
toFang: true, // 新房
}
return (
<div style={{width: 600, margin: '50px auto'}}>
<ul>
<li>
<h3>react常规写法</h3>
{
record.toKe
? <a style={{padding: 20}} href="https://bj.ke.com">贝壳首页</a>
: null
}
{
record.toSecondHand
? <a style={{padding: 20}} href="https://bj.ke.com/ershoufang/">二手房</a>
: null
}
{
record.toFang
? <a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/">新房</a>
: null
}
</li>
</ul>
</div>
)
}
export default App
如上述代码,我们在项目中会遇到很多这样的写法, 细看一下没什么问题,可是当在重构老项目的时候,你会发现这个代码结构是多么痛苦,特别是如下的结构。
{
record.toFang && record.toKe && record.toSecondHand
&& <div>
<a style={{padding: 20}} href="https://bj.ke.com">贝壳首页</a>
<a style={{padding: 20}} href="https://bj.ke.com/ershoufang/">二手房</a>
<a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/">新房</a>
</div>
}
虽然代码逻辑没问题,但人生就是这样,有时候出场顺序真的很重要。突然就想起vue的v-if了。
没错,回归主题,就是:react中模拟vue的v-if
先上代码
import React from 'react'
import Hidden from './Hidden'
const App = () => {
const record = {
toKe: true, // 贝壳首页
toSecondHand: true, // 二手房
toFang: true, // 新房
}
return (
<div style={{width: 600, margin: '50px auto'}}>
<ul>
<li>
<h3>react模拟实现vue中v-if指令</h3>
<Hidden visible={record.toKe} tag='span'>
<a href="https://bj.ke.com">贝壳首页</a>
</Hidden>
<Hidden visible={record.toSecondHand} tag='span' style={{padding: 20}}>
<a href="https://bj.ke.com/ershoufang/">二手房</a>
</Hidden>
<Hidden visible={record.toFang} tag='p'>
<a href="https://bj.fang.ke.com/loupan/">新房</a>
</Hidden>
</li>
</ul>
</div>
)
}
export default App
简单就是封装Hidden组件,通过visible去控制是否渲染。
相信聪明的你一定知道怎么去封装Hidden
笔者刚开始是这么写的
import React, { Component } from 'react'
export default class Hidden extends Component {
render() {
const { visible, children } = this.props
const content = visible ? children : null
return (
<div>
{ content }
</div>
)
}
}
如此简单,但笔者审查元素的时候发现,每个Hidden下的children莫名被嵌套了一层div
如下

原来的横着排列的元素,一下子竖着排列了。这可不太好,本来给我套个div,我都可以勉强接收,现在连我布局都给我变了。
怎么办?笔者突然想到使用vue-router中的router-link时,标签是可以通过tag去替换默认标签的。
那我们再给它个tag呗,连带自定义属性。
import React, { Component } from 'react'
export default class Hidden extends Component {
render() {
const { visible, children, tag = 'div', ...rest } = this.props
const content = visible ? children : null
return (
React.createElement(tag, rest, content)
)
// return (
// 尝试用这种方法去实现,发现不符合react的规则,所以使用最原始的渲染方法
// React.createElement
// `<`${tag}`>` + { content } + `</`${tag}`>`
// )
}
}
问题:笔者的初衷是模拟vue的v-if, 所以对传入的children并没做太多处理,不建议做多做封装。有兴趣的同学可以自己玩。
{
record.toFang && record.toKe && record.toSecondHand
&& <span>
<a style={{padding: 20}} href="https://bj.ke.com">贝壳首页</a>
<a style={{padding: 20}} href="https://bj.ke.com/ershoufang/">二手房</a>
<a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/">新房</a>
</span>
}
<Hidden
visible={record.toFang && record.toKe && record.toSecondHand}
tag='span'>
a href="https://bj.ke.com">贝壳首页</a>
<a style={{padding: 20}} href="https://bj.ke.com/ershoufang/">二手房</a>
<a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/">新房</a>
</Hidden>
其实感觉也没多大用处hhhh
好了,讲解完毕。
原文地址:https://segmentfault.com/a/1190000016897137
React碰到v-if的更多相关文章
- Vue于React特性对比(二)
一,关于响应式数据更新方式的实现 1)只有在data里面定义的数据才会有响应式更新 vue依赖的defineProperty的数据劫持加上依赖数据,实现数据的响应式更新.可以称之为依赖式的响应.因为依 ...
- 2017 年比较 Angular、React、Vue 三剑客(转载)
为 web 应用选择 JavaScript 开发框架是一件很费脑筋的事.现如今 Angular 和 React 非常流行,并且最近出现的新贵 VueJS 同样博得了很多人的关注.更重要的是,这只是一些 ...
- [译] 2017 年比较 Angular、React、Vue 三剑客
原文地址:Angular vs. React vs. Vue: A 2017 comparison 原文作者:Jens Neuhaus 译文出自:掘金翻译计划 本文永久链接:github.com/xi ...
- 关于React Native常用技巧
Doctor命令检查所需环境 @2019年11月18日,React Native v新增了一个环境检查和诊断命令行,可以帮助新手修复环境,输出环境依赖报告. 先建好的一个React Native项目, ...
- [转] npm 模块安装机制简介
npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一. 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 . $ npm install 本文介绍 npm ...
- npm 模块安装机制简介
npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一. 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 . $ npm install 本文介绍 npm ...
- Ant Table组件
http://www.cnblogs.com/hujunzheng/p/5689650.html React中使用Ant Table组件 v一.Ant Design of React http:/ ...
- Node.js环境搭建&&npm安装
Node.js环境搭建 什么使Node.js呢?我们知道JavaScript开始作为客户端语言,但早已在浏览器端一统江湖,这时,野心越来越大,它就想向服务器端拓展了,于是Node.js就是这样的,我们 ...
- npm模块安装机制
npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一.正因为有了npm,我们只要一行命令:npm install,就能安装别人写好的模块 . 一.从 npm ins ...
随机推荐
- Sublime Text 报“Pylinter could not automatically determined the path to lint.py
Pylinter could not automatically determined the path to lint.py. please provide one in the settings ...
- javascript的学习笔记---复习及学习
1.javascript包含三大部分(BOM,DOM,ECMAscript) ECMAscript:规定js的语法规范 BOM:Document Object Model 给我们提供了一套完整的操作页 ...
- web项目数据存入mysql数据库中文乱码问题
刚开始怀疑是项目中编码设置问题,发现在web.xml中已经有过设置:后来dubug显示数据在传输的过程中一切正常,怀疑是数据库编码问题,然后查看mysql编码: show variables like ...
- SpringBoot | 查看默认版本配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- 爬虫的UA池和代理池
爬虫的UA池和代理池 一.下载中间件 先祭出框架图: 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件. - 作用: (1)引擎将请求传递给下 ...
- 牛客寒假5-A.炫酷双截棍
链接:https://ac.nowcoder.com/acm/contest/331/A 题意: 小希现在手里有一个连着的两块木条,长度分别为l1l1,l2l2,木条之间有一个无摩擦的连接点,木条之间 ...
- bzoj3583 杰杰的女性朋友 || bzoj4362 Graph
http://210.33.19.103/problem/2174 很显然是矩阵快速幂的题,设有in和ou矩阵,设in矩阵的转置为in' 显然可以直接暴力求出任意两点间走一步路径条数,然后求其d次幂, ...
- tera term 的一个命令解析脚本
;用虚拟串口虚拟2个串口,tera term使用串口2 ;设置串口2 波特率 115200,超时500ms;如果收到串口发来OK则回复SUCCESS;如果收到ERROR则回复faile;若超时则发送t ...
- 持续集成~Jenkins里的NuGet和MSBuild插件
Jenkins是一个持续集成的环境,它是java开发的,大叔认为它的工作流程是 从源代码拉一个项目下来到它本地(可以配置定时机制) 恢复相关程序包nuget 编译程序 发布程序 现在说一下在配置jen ...
- [转]AngularJS Cookies Example
AngularJS Cookies Example AngularJS 提供了很好的 $cookie 和 $cookieStore API 用来处理 cookies . 这两个服务都能够很好的发挥HT ...