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 ...
随机推荐
- Markdown - 如何使用上标、下标
解决方法 Markdown可以和HTML的语法兼容,可以通过HTML的上标和下标标签来实现效果: 标签 写法 效果 上标 2<sup>10</sup> 210 下标 H< ...
- SqlServer存储过程调用接口
因项目需求.需实现新增数据->触发器->存储过程->调用接口. https://blog.csdn.net/u010485134/article/details/58603370 另 ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- 【bzoj1726】Roadblocks
1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1578 Solved: 795[ ...
- Excel 通过pl/sql导入到数据库 文本导入器 odbc导入器
Excel 通过pl/sql导入到数据库 第一种方法:文本导入器 1.准备Excel导入数据 jc.xls 2.把 jc.xls 文件 改为 jc.csv文件 3.在数据库里建一张jc表(FLH ...
- Java中的list与Set、Map区别及适用场景
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类,但是却让其被继承产生了两个接口,就是Set和List.Set中不能包含重复的元素.List是一个有序的集合,可以包含 ...
- Longest Palindromic Substring笔记
这是一道在leetcode上看到的题目 一开始,我能想到的思路是蛮力法: 就遍历每个字符,然后对每个字符都尝试从1到n的长度,看有没有回文串,并记录以该字符起始的回文串的最大长度.这个思路其实没有上手 ...
- 552 Student Attendance Record II 学生出勤记录 II
给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值.学生出勤记录是只包含以下三个字符的字符串: 1.'A' : ...
- linux ln -s 软链接
一.创建 ln -s 源文件 目标文件 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln ...
- Nodejs chrome 调试node-inspector
1.下载扩展: 全局安装 npm install -g node-inspector 2.开启debug调试: node --debug[=port] filename (默认端口5858)node ...