当前位置: 首页 > 编程日记 > 正文

react遇到的各种坑

  • 标签里用到<label for>的,for 要写成htmlFor
  • 标签里的class要写成className
  • 组件首字母一定要大写
  • 单标签最后一定要闭合
  • 如果html里要空格转义,&nbsp;注意不要漏了分号;
  • style要写成style={{clear: 'both',backgroundColor:'red',width:'200px'}}
  • 组件里能用<button>的地方就不要用input type="button"了,否则写个value还要用{}
  • 标签里的ref属性的属性名不要出现中横杠比如message-content,如果有多个单词,直接写成驼峰形式
  • 把要改变的数据写进父组件的getInitialState的属性里,然后通过this.props.listArr传进去,表明初始状态是组件里listArr里的属性。
  • 如果将子组件改变的数据传递给父组件呢?可以在父组件里申明一个函数,里面传参data,然后在创建出子组件的对象的时候在属性上传入父组件的这个函数,然后在子组件里触发了某个事件的函数里,通过this.props.addItem()这样的方式调用父组件的函数,这个addItem就是父组件的函数,里面传参
  • 如果组件之间的通信超过的一层,传参就非常麻烦,需要用到react的一个插件叫PubSub订阅发布

(1) 先导入库
(2) 全局设置一个事件名称,子组件和父组件共用,比如var deleteItem = 'deleteItem';
(3) 子组件,触发事件之后,发布事件


//使用PubSub.publish(),第一个参数是公用的事件名称,第二个参数是你要传播的值
deleteItemHandler:function(){ PubSub.publish(deleteItem, this.props.item); },

(4) 父组件,是等组件全部渲染之后,因为组件还在内存中,虚拟DOM还没有渲染出来,没有正式出现在页面上时,是获取不到真是DOM的,所以在componentDidMount的函数里订阅一个从子组件发布出来的事件,在渲染完成后,会自动触发这个函数


//使用PubSub.subscribe(),第一个参数是公用的事件名称,第二个参数是一个回调函数,可以是用箭头函数方式使它内部this指向组件对象,evName是事件对象,data就是子组件发布过来,这里接受到的data
componentDidMount:function(){ PubSub.subscribe(deleteItem,(evName,data) =>{ var newArr = this.state.listArr.filter(function(item,index){ return item!= data; }); this.setState({ listArr:newArr }); }); },
  • 这里顺便复习一下Arrayfilter()方法,参数里是个函数,参数是项和下标,return里写一个条件,所有符合条件的都会提取出来放到一个新的数组里,这里将数组里不等于传回来的这个data里的值的每一项都放到了newArr里,然后通过setState(),更新state里数组的值
  • 利用ReactCSSTransitionGroup来添加一些简单的动画效果,比如列表内容增加或者删除时可以有渐进渐出的效果。但是这个标签默认是span标签,使用在table或者options里提示警告,不能在tableoptions里嵌套span,所以可以通过它本身的component属性,比如component="div"直接将这个标签渲染为我们需要的标签即可。另外css里对应的动画时间要和这里标签里的时间对应

    var ListComponent = React.createClass({
    render: function(){return ( <ReactCSSTransitionGroup component="div" id="message-container" transitionName="messageContainer" transitionEnterTimeout={800} //这里定义渐进的时间 > { //这里放该组件的子级,也就意味写着这里面所有的内容的都会有动画效果, this.props.mesArr.map(function(ele){ return <ItemComponent key={ele.time} {...ele} /> }) } </ReactCSSTransitionGroup> ) } });
  • 通过搜索框输入字符让显示区即时地筛选出搜索结果的效果。这里的难点是,如果直接通过onChange来获取打入的字符串来更新父组件的state里的数据,会造成数据返回不到原来的状态。所以思路可以是这样的,在父组件state里先创建一个空数组,每次当搜索框获取到焦点时,就把父组件当前的显示数据赋值给这个新建的数组,然后filter的时候是通过这个新数组里的数据进行筛选,而不是原来的数据,另外,当搜索框内容为空或者失去焦点时,再把视图的数据恢复到得到焦点时的状态即可。下面是可以实现的父组件中的代码:

//在搜索框聚焦时,将当前state里的userList赋值给currentList,然后每次输入,筛选的对象都是currentList
focusHandler:function(){this.state.currentList = this.state.userList; }, //在失去焦点时立刻将刚才存储的currentList赋值给userList,让视图再恢复到点击搜索框之前 blurHandler:function(){ this.setState(function(){ return { userList: this.state.currentList } }); }, //搜索功能 searchUser:function(text){ //这里要将text进行判断,如果为空,就要让视图呈现刚聚焦时的状态,否则就进行筛选 if(text!=''){ var newText = text.toLowerCase(); var newArr = this.state.currentList.filter(function(item){ //每次点击通过保存的currentList来过滤 return item.username.toLowerCase().indexOf(newText) != -1; }); this.setState(function(){ return { userList: newArr } }); }else{ this.setState(function(){ return { userList: this.state.currentList } }); } },
  • React-Router动画的结合使用
    除了两种技术的结合之外,有个很重要的地方不要忘记,就是要让每个单独的组件设置样式为position:absolute,否则在动画切换时会出现短暂组件叠加的的情况,用户体验非常差,但是绝对定位后,每个组件都在同一个地方渐入渐出了。
//这里是react创建组件的ES6新写法,省略了function和内部的render,return。
const MenuComponent = ({ children, location }) => (<div> //这里是将组件Menu下控制的路由写在这里,每个路径用Link标签包起来,通过属性to来控制对应不同的路径<div className="col-md-3 list-group"> <Link to="/statistic" className="list-group-item active">Website Statistic Data</Link> <Link to="/topics" className="list-group-item">Hot Topics</Link> <Link to="/visits" className="list-group-item">Today's Visits</Link> <Link to="/status" className="list-group-item">Server Status</Link> </div> //这里把要对应的做成动画的区域用ReactCSSTransitionGroup包起来 <ReactCSSTransitionGroup className="col-md-9 pr clearfix" component="div" transitionName="content" transitionEnterTimeout={500} transitionLeaveTimeout={500} > {React.cloneElement(children, {key: location.pathname,className:"pa"})} </ReactCSSTransitionGroup> </div> ) -------------------------------------------------------------- //这里是render方法里的写法 ReactDOM.render( <Router> //根路由 // "/"代表根路由,IndexRoute表示索引页,如果没有索引页可以作为默认显示的内容 <Route path="/" component={MenuComponent}> <IndexRoute component={StatisticComponent} /> <Route default path="statistic" component={StatisticComponent} /> <Route path="topics" component={TopicComponent} /> <Route path="visits" component={GuestComponent} /> <Route path="status" component={StateComponent} /> </Route> </Router> ,document.getElementById('container') );
  • 用ES6的箭头函数写组件
const MenuComponent = ({ children, location }) => {//定义组件里的函数直接在组件里申明即可const changeLink = (ev) => {var parent = ev.target.parentNode;var children = parent.children;for(var i=0; i<children.length; i++){children[i].classList.remove('active'); } ev.target.classList.add('active'); }; //这届写return (),里面写标签 return ( <div> <div className="col-md-3 list-group" onClick={changeLink}> //这里不用再写this.changeLink了 <Link to="/statistic" className="list-group-item active">Website Statistic Data </Link> <Link to="/topics" className="list-group-item">Hot Topics</Link> <Link to="/visits" className="list-group-item">Today's Visits</Link> <Link to="/status" className="list-group-item">Server Status</Link> </div> <ReactCSSTransitionGroup className="col-md-9 pr" component="div" transitionName="content" transitionEnterTimeout={500} transitionLeaveTimeout={500} > {React.cloneElement(children, {key: location.pathname, className: "pa"})} </ReactCSSTransitionGroup> </div> ); };

转载于:https://www.cnblogs.com/frx666/p/6690817.html

相关文章:

html页面视频标签,html5基础标签(html5视频标签 html5新标签用法)

点评&#xff1a;html5基础&#xff0c;包括html5视频标签和html5新标签等标签用法&#xff0c;大家参考使用吧1、 声明的变化2、 指定字符编码的变化&#xff0c;html5中建议使用utf-83、 Html5中允许没有结束符&#xff0c;不算错误4、 不允许写结束标记的有&#xff1a;…

chronyd服务

一、makestep步进时间选项 最近做RHCE的实验&#xff0c;nfs用krb5p实现全程加密和身份认证&#xff0c;需要nfs服务端、客户端的时间与KDC的时间同步&#xff0c;否则kerberos分发的ticket就会失效&#xff0c;nfs不能挂载和访问。那么就需要在nfs的服务端、客户端都配置chro…

软件测试人员必备Linux命令(初、中、高级)

有些技能可以事半功倍&#xff0c;有些命运掌握在我们手中。熟练的掌握和使用这些命令可以提高工作效率&#xff0c;并且结合这些命令对测试过程中遇到的问题进行一些初步的定位。 1 目录与文件操作 1.1 ls(初级) 使用权限&#xff1a;所有人 功能 : 显示指定工作目录下之内容&…

酷派android手机怎么截屏,酷派S688怎么截屏截图?

夏普AQUOS S2事水滴全面屏&#xff0c;搭配骁龙630处理器&#xff0c;个人手里就是这货&#xff0c;目前售价千元内&#xff0c;按需求不高的人&#xff0c;可以考虑&#xff0c;不过系统不很行基于Android 7.1.1深度优化的Smile UX系统实在表现一般。~~~~根据美国FCC的认证信息…

01 多线程概念及其实现方式

多线程是编程过程里必不可少的内容&#xff0c;学习多线程&#xff0c;就先要了解进程和线程的概念。进程&#xff1a;是指当前正在运行的程序&#xff0c;是一个程序在内存里的执行区域&#xff1b;线程&#xff1a;是在进程里的一个执行控制单元&#xff0c;执行路径&#xf…

负载均衡层次分析

什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 常见的负载均衡方案 常见互联网分布式架构如上&#xff0c;分为客…

Python基础01-Python环境搭建与HelloWorld

目录 从今天开始学习Python Python环境搭建 安装gcc Python源码包安装 开始Python第一个代码HelloWorld&#xff01; 从今天开始学习Python 为啥选择Python&#xff0c;可能是跟随潮流吧。我现在不知道为什么学习Python&#xff0c;但是可能一年到一年半以后&#xff0c;…

oracle与mysql创建表时的区别

oracle创建表时&#xff0c;不支持在建表时同时增加字段注释。故采用以下方式&#xff1a; #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varchar2(80),mid varchar2(80),time date ,conten…

在Linux上安装Memcached服务

下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载&#xff1a;http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外&#xff0c;Memcache用到了libevent这个库用于Socket的处理&#xff0c;所以还需要安装libevent&#xff0c;libevent的最…

图形化编程 html,用GoJS实现图形化交互编程界面示例

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定function init() {var $ go.GraphObject.make; //for conciseness in defining node templatesmyDiagram $(go.Diagram, "myDiagramDiv", //Diagram refers to its DIV HTML element by id{"undoMan…

枚举位移计算操作

如&#xff1a; typedef NS_ENUM(NSInteger, Test) { // 十进制 二进制 TestA 1 << 0, // 1 00001 TestB 1 << 1, // 2 …

Python基础02-Python基础

脚本的第一行 Python脚本的第一行&#xff0c;写Python解释器的路径。这样就可以直接执行Python脚本。 脚本编码 Python2需要指定脚本的编码&#xff0c;Python3不需要指定。 # -*- coding:utf8 -*- 使用input做简单的交互 username input(请输入用户名密码:) password …

SpringBoot上传文件大小限制

SpringBoot默认上传文件大小不能超过1MB&#xff0c;超过之后会报以下异常&#xff1a; org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.at org.apache.tomcat.…

html实时显示log,websocketd 实现浏览器查看服务器实时日志

操作系统CentOS7下载 websocketd安装 nc 命令yum install nmap-ncat创建监听脚本cat > cmd.sh <#!/bin/bashpkill -x ncwhile :; donc -nkl 10088sleep 1done创建 log.htmlbody{background-color: #0e1012;color: #ffffff;}*{margin: 0; padding: 0;}#msg{overflow:auto;…

git 合并两个分支的某个文件

软件开发基本都是多个feature分支并行开发&#xff0c;而在上线前有可能某个分支的开发或测试还没有完成&#xff0c;又或者是产品调整&#xff0c;取消了该分支功能的上线计划&#xff0c;我们在release前不合并该分支即可&#xff0c;然而如果该分支中的某些小调整却需要上线…

lattice diamond 3.7安装破解

第一步安装&#xff1a;执行.EXE文件&#xff0c;一直下一步&#xff0c;最后license选择没有USB什么的那个&#xff08;具体记不清了&#xff09;。 第二步破解&#xff1a;安装完成后在环境变量中将license路径指定到license文件即可&#xff08;LM_LICENSE_FILE d:\lscc…

Python基础03-运算符

运算符 算数运算符 算数运算符符号运算数字用法举例字符串用法举例加a 2 3 print(a) # 5s1 "hello" s2 "world" s s1 s2 print(s) # helloworld-减a 12 - 3 print(a) # 9*乘a 12 * 3 print(a) # 36s1 "hello" s2 "world" s…

shell下的作业管理(转)

作业管理 举例来说&#xff0c;我们在登陆 bash 后&#xff0c; 想要一边复制文件、一边进行数据搜寻、一边进行编译&#xff0c;还可以一边进行 vi 程序撰写&#xff01; 当然我们可以重复登陆那六个文字介面的终端机环境中&#xff0c;不过&#xff0c;能不能在一个 bash 内达…

合并模拟器和真机的静态库动态库aggregate

创建Aggregate的target 在Build Phases 添加Run Script,内容为 scriptFile${SRCROOT}/universalA.shsh ${scriptFile} universalA.sh放在工程根目录&#xff0c;内容为&#xff1a; if [ "${ACTION}" "build" ]then echo "合并模拟器真机库" ta…

html表格联动,html前端基础:table和select操作

html前端基础&#xff1a;table和select操作发布时间&#xff1a;2020-05-13 09:58:10来源&#xff1a;亿速云阅读&#xff1a;196作者&#xff1a;Leah这篇文章主要为大家详细介绍html前端基础中有关table和select的操作&#xff0c;配合代码阅读理解效果更佳&#xff0c;非常…

Python基础04-数据类型:数字、布尔、字符串

目录 数字 布尔 字符串 字符串的常用函数 字符串的内存分析 字符串练习题 数字 判断是数字类型还是字符串类型。 # <class str> 123 a "123" print(type(a), a)# <class int> 123 b int(a) print(type(b), b) 十进制、二进制、八进制、十六进…

一起学Hadoop——实现两张表之间的连接操作

---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据&#xff08;一个文件可视为一张表&#xff0c;hive和关系型数据库Mysql、Oracle等都是将数据存储在文件中&#xff09;。但是我们经常会遇到处理多张表的场景&#xff0c;不同的数据存储在不同的文件中&…

scala学习笔记-过程、lazy值和异常(6)

过程 在Scala中&#xff0c;定义函数时&#xff0c;如果函数体直接包裹在了花括号里面&#xff0c;而没有使用连接&#xff0c;则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。 过程还有一种写法&#xff0c;就是将函数的返回值类型定…

为计算机编程序英语作文,计算机编程员英文简历范文

以下是无忧考网为大家整理的关于计算机编程员英文简历范文的文章&#xff0c;希望大家能够喜欢&#xff01;Basic information:Name: Yjb ys Gender: MaleAge: 21 Nationality: ChineseResidence: Guangdong - Huizhou height and weight: 178cm 60KGMarital status: Single Ed…

android常用命令

创建模拟器&#xff1a; 进入sdk下tool文件夹&#xff1a; cd ...../tools 检查target ID: ./android list targets 创建名为hello的AVD: ./android create avd -n hello -t 1 创建的模拟器默认在~/.android/avc/ 启动模拟器&#xff1a; ./emulator -avc hello 安装apk: 进入p…

Python基础05-数据类型:列表list

目录 列表 列表的一般用法 列表的方法 列表 列表的一般用法 列表用[]括起来&#xff0c;用逗号分隔元素。元素可以是任意的类型。 可以用len获取列表的长度&#xff0c;也就是元素的个数。 # 列表是个大杂烩&#xff0c;什么类型都可以往里面装 li [2019, 12, "存储…

h5打开App的方法。

在浏览器中&#xff1a;法1&#xff1a;location.href ${scheme};//location跳转App是几乎所以情况都支持的。法2&#xff1a;var ifr document.createElement(iframe);//iframe跳转有的地方不支持// ifr.src ${scheme};// ifr.style.display none;// document.body.append…

html作业三,3.15作业

html>科比简介div{width: 480px;height:230px;background-image:url(images/kobe.jpg);background-color:#567854;background-size:500px 250px;padding:10px;box-shaow:10px 10px 10px #666;}.text{color:#556644;text-indent: 3em;line-height: 1.4em;}科比布莱恩特 (美国…

HTML4 和 HTML5 的10个关键区别

http://www.oschina.net/news/22219/html4-html5-differences/转载于:https://www.cnblogs.com/antis/p/6708303.html

smartgit 授权文件 Free Trial License to Non-Commercial

Windows&#xff1a; %APPDATA%/syntevo/SmartGit/ OS X&#xff1a; ~/Library/Preferences/SmartGit/ Unix/Linux&#xff1a; ~/.smartgit/ and remove the file settings.xml 例如windows: 开始 运行 %APPDATA%/syntevo/SmartGit/ 就会自动找到路径删除settings.xml…