todolist形式的搜索框,分开组件写的,点击上下键时,框内显示当前选中的内容
### 首先 安装react 脚手架
cnpm install create-react-app -g //只需要在电脑上安装一次就好了,以后不用再下载了
### 创建项目
create-react-app 项目名( todo )
### 进入项目todo 运行项目
npm start ---------或者下载 cnpm install yarn --save 后输入yarn start 也可以运行项目
### 创建三个文件夹分别为:App todo list
将App.js 和App.css 放入到 App文件夹中------>在到index.js中 把引入App.js的路径改一下
import App from './App/App';
在todo list 这两个文件夹中 分别在创建一个js文件,一个css样式文件
在这里就简单的创建to.js to.css 和 list.js list.css
###在to.js 中写入代码
import React, {Component} from 'react'; //---->引入react模块
import "./to.css" //---->引入to.css样式文件
class To extends Component {
constructor(props) {
super(props);
this.state={ //--->初始化状态 ,所有添加的数据都从这里获取
tt:"",
cc:false //--->定义一个状态为false的属性,通过属性的true,false通过三目运算符来判断
}
} ch(e){ //---->获取input框中用户当前输入的数据
this.setState({tt:e.target.value});//--->更新状态后渲染
}
add(){ //添加 子组件通过事件触发的方法,通过方法的参数,将值传递给父组件
this.props.ad(this.state.tt) //--->将当前的用户输入的数据传递给父组件
this.state.tt="" //--->让当前用户点击添加后,input框中的值为空
}
render() {
return (
<div className="zjb_box" onClick={this.props.ak}> {/* 这是通过兄弟组件传值的方法,把父组件中的方法调用过来*/}
{/* 获取用户的value 值得时候,需要加一个onChange事件 这是在react中的获取value值的方法 */}
<input className="zjb_in" type="text" value={this.state.tt}
onChange={this.ch.bind(this)} onFocus={this.props.bb}
onKeyDown={this.props.asss}/>{/* 当按键按下的时候,调用了父组件App.js中的方法*/}
<button onClick={this.add.bind(this)}>百度一下</button>
<div className="ss" onClick={this.props.as}></div>{/*这是让添加数据的ul框能在鼠标点击空白区域隐藏的一种方法,有点low,后面还有一种更好的办法*/}
</div>
);
}
} export default To;{/*导出文件*/}
### 在to.css中的样式,简写的,样式就不注释 了
body,div,input,p{
margin: 0;
padding: 0;
}
.zjb_box{
width: 600px;
height: 600px;
border: 1px solid #000;
margin: 100px auto;
position: relative;
}
.zjb_in{ width: 400px;
height: 40px;
margin: 20px 20px;
}
button{
width: 100px;
height: 40px;
}
.ss{
width: 600px;
height: 600px;
border: 2px solid #ccc;
}
###在list.js中写入代码
import React, {Component} from 'react';//--->引入react模块
import "./list.css"//--->引入list.css样式
class List extends Component {
constructor(props) {
super(props);
} del(n){//删除的方法 n为当前的下标
this.props.remove(n);//--->将当前的下标传入到父组件中
} render() {
return (
<div className="zjb_bb" style={{display:this.props.aa?"block":"none"}}>
<ul style={{display:this.props.aa?"block":"none"}}>{/*如果是true,就显示,false就隐藏*/}
{
this.props.zjb_ch.map((v,i)=>{ {/*注释this.props.zjb_ch==i?"ac":""*/}
return <li key={i} className={this.props.ac===i?"ac":""}>
{v}
{/*单行显示删除,可以num=0;this.state.num===i?"显示":"否则隐藏"*/}
<a href="#" onClick={this.del.bind(this,i)}
className={this.props.ac===i?"za":" "}>删除</a>{/*通过当前下标一样的时候,显示删除,不一样的,就为空*/}
{/*<div className="asas"></div>*/}
</li>
})
}
</ul>
</div>
);
}
} export default List;{/*导出*/}
###在list.css中写入样式
*{
margin: 0;
padding: 0;
list-style: none;
}
.zjb_bb{
position: absolute;
width: 402px;
top: 164px;
left: 286px;
/*border: 1px solid #000;*/
}
.zjb_bb>ul{
display: none;
/*height: 400px;*/
border: 1px solid #000;
}
.ac{
background: red;
}
.za{
float: right;
color: #000;
margin-right: 20px;
}
.asas{
width: 1000px;
height: 1000px;
border: 2px solid greenyellow;
}
###最后回到主文件App.js中
import React from 'react'; //--->引入react模块
import To from "../todo/To"; //--->引入to.js文件
import List from "../list/list"; //--->引入list.js文件 class App extends React.Component {
constructor(props) {
super(props);
var arr0=localStorage.getItem("arr"); //---> 获取本地的储存
if(arr0){ //本地储存中如果有数据的话就会执行if中的true
var arr1=JSON.parse(arr0); //--->将字符串转换为对象
}else{
var arr1=[]; //--->如果本地储存中没有数据,就是null,先执行if中的else 创建一个新数组, 之后再渲染,输出本地储存,在渲染到页面上
} this.state={
list:arr1,
cc:false,
num:0
}
}
add1(v){ //--->添加的方法 v就是to.js中传过来的input框中用户输入的值
var list=this.state.list; //获取当前的初始状态中的list
list.push(v); //将用户输入的值添加到list中
var list1=JSON.stringify(list);//--->将当前的list是拼接的对象转换为字符串
localStorage.setItem("arr",list1);//--->将数据储存到本地内存中
this.setState({list}) //--->更新状态后 页面又渲染了一次
// alert(this.state.list)
} del1(n){//删除的方法 n为list.js中传递过来的下标
var list=this.state.list;
list.splice(n,1);
var list1=JSON.stringify(list);
localStorage.setItem("arr",list1);
this.setState({list})
}
bb1(){//通过cc的属性来判断,当点击后让cc的状态为true
this.setState({cc:true})
}
ass(){
this.setState({cc:false})
}
asa(e){//键盘事件,上下键
if(e.keyCode===38){
console.log(e.keyCode);
var n=this.state.num;//--->通过num判断,在list.js中如果num和下标i相等的话,就让ac的class样式显示
n--;
if(n<0){
n=this.state.list.length-1
}
this.setState({num:n,tt:this.state.list[n]})
}
if(e.keyCode===40){
// alert(11)
var n=this.state.num;
n++;
if(n>this.state.list.length-1){
n=0
}
this.setState({num:n,tt:this.state.list[n]})
}
}
// dcc(e){
// if(e.target.nodeName=="DIV"){--->获取当前div的节点DIV,能获取到就改变cc的boolearn值
// this.setState({cc:false})
// }
//隐藏
hide=(e)=>{//--->通过获取当前的大div的节点来改变cc的true和false
console.log(e.target.nodeName)
if(e.target.nodeName=="DIV"){
this.setState({cc:false})
}
}
// }
render() {
return (
<div>
<To ad={this.add1.bind(this)} bb={this.bb1.bind(this)}
as={this.ass.bind(this)} ak={this.hide.bind(this)}
cc={this.state.cc} asss={this.asa.bind(this)}></To>{/*这是to.js中的组件*/}
<List zjb_ch={this.state.list} remove={this.del1.bind(this)}
aa={this.state.cc} ac={this.state.num}></List>{/*这是list.js中的组件*/}
</div>
);
}
} export default App;
###如果有喜欢研究的志同道合的朋友,欢迎一起交流!!!
todolist形式的搜索框,分开组件写的,点击上下键时,框内显示当前选中的内容的更多相关文章
- 尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框
尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框 近期正在逐步摸索学习React的用法,尝试着写几个通用型的组件,整体项目还是根据webpack+react+css-me ...
- React后台管理系统-商品列表搜索框listSearch组件
1.商品列表搜索框 2.搜索框页面的结构为 <div className="row search-wrap"> <div classN ...
- [js开源组件开发]js文本框计数组件
js文本框计数组件 先上效果图: 样式可以自行调整 ,它的功能提供文本框的实时计数,并作出对应的操作,比如现在超出了,点击下面的按钮后,文本框会闪动两下,阻止提交.具体例子可以点击demo:http: ...
- angular2.x 下拉多选框选择组件
angular2.x - 5.x 的下拉多选框选择组件 ng2 -- ng5.最近在学angular4,经常在交流群看见很多人问 下拉多选怎么做... 今天就随便写的个. 组件源码 百度云 链接: ...
- Vue 单选框与单选框组 组件
radio组件 v-model : 通过当然绑定的值与input上的value值来确定当前选中项. 在父作用域中通过active设置当前默认选中项,如果选中项发生改变后通过input事件通知传递到父 ...
- MUI组件四:选择器、滚动条、单选框、区域滚动和轮播组件
目录(?)[+] 1.picker(选择器) mui框架扩展了pipcker组件,可用于弹出选择器,在各平台上都有统一表现.poppicker和dtpicker是对picker的具体实现.*pop ...
- jQuery EasyUI/TopJUI创建文本验证框(不写js,纯HTML实现!!!)
jQuery EasyUI/TopJUI创建文本验证框(不写js,纯HTML实现!!!) validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效.如果用户输入了无效的值,它将会更改 ...
- Py3+PyQt5+Eric6:学习记录之第一天:点击按钮获取文本框的值并输出。
一.使用qt designer拖拽界面. 使用qtdesigner拖拽界面:
- 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果
原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...
随机推荐
- 简要概述java内存模型,以及volatile关键字
如果我们要想深入了解Java并发编程,就要先理解好Java内存模型.Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步.原始的Java内存模型效率并不是很理想,因此 ...
- vue自定义弹框
vue 全局自定义简单弹框 https://www.jianshu.com/p/1307329aa09e https://www.cnblogs.com/crazycode2/p/7907905.ht ...
- NetworkX系列教程(2)-graph生成器
小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...
- jquery实现图片切换
<div> <img class="imgclick" src="img/pic1.png" /> </div> <s ...
- nodejs爬虫案例笔记
用nodeJs制作一个简单的网页爬虫 主要分为三个步骤,向目标请求数据,处理数据,打印数据.需要用到的模块有http,cheerio. 1.准备步骤,引入要使用的模块 2.向目标请求数据 http.g ...
- Concurrent初探 --- Atomic 无锁
一.CAS算法 Compare And Swap,CAS算法的过程是这样:它包含3个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值.仅当V值等于E值时,才会将V的值设为N,如果 ...
- vue从一个组件跳转到另一个组件页面router-link的试用
需求从helloworld.vue页面跳到good.vue页面 1.helloworld.vue页面代码 <template> <div class="hello" ...
- Arts打卡第8周
Algorithm.主要是为了编程训练和学习. 每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard). 进行编程训练,如果不训练你看再多的算法书,你依然不 ...
- Mac下不能成功打开uiautomatorviewer的问题解决
在终端运行uiautomatorviewer之后出现下面的错误,检查以后发现环境变量也配置好了 Error: Could not create the Java Virtual Machine. Er ...
- java.lang.ClassNotFoundException:org.apache.struts2.dispatcher.FilterDispatcher
老版本的Struts2升级,启动报的错. org.apache.struts2.dispatcher.FilterDispatcher 是web.xml中对struts2 2.2版本的接入点的类. ...