公司一直是前后端分离的,最近集团开始推进中后台可视化开发组件(基于React封装),跟师兄聊起来也听说最近对后台开发人员的前端能力也是越来越重视了。所以作为一名后端,了解下前端的框架对自己也是大有好处的!

首先,博主由于在小公司做过,有一定的前端基础,但是学习React框架的时候还是遇到了一些阻力。因为前端框架的一些思想是和后端完全不同的,特别是React这个面向组件的动态语言框架,用起来非常灵活。

顺便说点闲话,一个优秀的前端待遇会比同级别后端还要高一些,   因为一名优秀的前端不仅要不停的学习不断更迭的新技术外、也要能够熟练地在和运营、测试以及产品撕逼中处理问题。还记得在前后端分离前,撕逼这件事一直是后端同学来面对的。分离后、后端同学只要做一名默默无闻的螺丝钉就可以了。

好了开始正题,首先,官网祭天!

官网:offical website:https://react.docschina.org/
    特点:
    声明式:只需要改变数据源的数据,就能实现页面数据元素的更新。
    组件化:差分成多个可复用的组件,组装自己的页面。

虚拟DOM(对象对应DOM元素),不是总是更新DOM。
    根据算法,最小重绘页面,减少更新的区域。

传值Demo:

1、主页面,引用了一个自定义组件>TodoList:

  render() {
return (
<TodoList />
);
}

2、看一下自定义组件中的代码:

import React, { Component, Fragment } from 'react';

export default class TodoList extends Component {
static displayName = 'TodoList'; constructor(props) {
super(props);
this.state = {
inputVaule: '',
list: ['默认的第一行', '默认的第二行', '默认的第三行'],
};
} render() {
return (
<div className="page5-page">
<input
value={this.state.inputValue||""}
onChange={this.valueChange.bind(this)}
/>
<button onClick={this.butClick.bind(this)}>submit</button> // 循环list显示
<ul>
{
this.state.list.map((item, index) => {
return (
<li key={index} onClick={this.deleteLi.bind(this,index)} >
{item}
</li>
);
})
}
</ul>
</div>
);
}
//当Input组件中值变动后更新为新的值
valueChange(e) {
console.log(e.target.value);
this.setState({
inputValue: e.target.value,
});
}
//按钮点击事件-添加值
butClick() {
this.setState({
list: [...this.state.list, this.state.inputValue],
inputValue: '',
});
}
//点击事件-删除值
deleteLi(index){
console.log(index);
const listNew = [...this.state.list];
listNew.splice(index, 1)
this.setState({
list: listNew
}); }
}

3、显示效果,上面的代码实现了TODOLIST的增删改查功能:

4、上一步的基础上,抽取循环代码为一个列表组件-Item,这样,组件的结构如图:

5、此时涉及到组件传值的问题,这里要注意,React中,所有传值都是自上而下的:

抽取出的Item组件:

mport React, { Component } from 'react';

export default class Item extends Component {
constructor(props) {
super(props);
// this.clickChild.bind(this)
this.clickChild=this.clickChild.bind(this);
this.state = {
inputValue: '',
test: '',
};
}
render() {
return <li onClick={this.clickChild.bind(this)}>{this.props.content}</li>
}
clickChild(){
this.props.deleteLi(this.props.index);
}
}

6、相应的中层组件,注意组件的传值方式:

<Item content={item}

index={index}

deleteLi={this.deleteLi.bind(this)}

/>

import React, { Component, Fragment } from 'react';
import Item from './Item'; export default class TodoListNewA extends Component {
static displayName = 'TodoList'; constructor(props) {
super(props);
this.state = {
inputVaule: '',
list: ['默认的第一行', '默认的第二行', '默认的第三行'],
};
} render() {
return (
<div className="page5-page">
<input
value={this.state.inputValue||""}
onChange={this.valueChange.bind(this)}
/>
<button onClick={this.butClick.bind(this)}>submit</button>
<ul>
{
this.state.list.map((item, index) => {
return (
<Fragment>
<Item content={item}
index={index}
deleteLi={this.deleteLi.bind(this)}
/>
</Fragment>
);
})
}
</ul>
</div>
);
}
valueChange(e) {
console.log(e.target.value);
this.setState({
inputValue: e.target.value,
});
}
//按钮点击事件-添加值
butClick() {
this.setState({
list: [...this.state.list, this.state.inputValue],
inputValue: '',
});
}
//点击事件-删除值
deleteLi(index) {
console.log(index);
const listNew = [...this.state.list];
listNew.splice(index, 1)
this.setState({
list: listNew,
}); }
}

【React入门】React父子组件传值demo的更多相关文章

  1. 使用react进行父子组件传值

    在单页面里面,父子组件传值是比较常见的,之前一直用vue开发,今天研究了一下react的父子组件传值,和vue差不多的思路,父组件向子组件传值,父通过初始state,子组件通过this.props进行 ...

  2. React创建组件的方法,组件的props属性、state属性的用法和特点,父子组件传值,兄弟组件传值

    创建组件的方法,组件的props属性.state属性的用法和特点,父子组件传值,兄弟组件传值 1.react组件 1.1.创建组件的方法 1.1.1.函数组件 定义一个组件最简单的方式是使用JavaS ...

  3. 十八、React react-router4.x中:实现路由模块化、以及嵌套路由父子组件传值

    一.路由模块化(用字典定义路由,然后循环出来) 1.官方文档参考 [官方文档]https://reacttraining.com/react-router/web/guides/quick-start ...

  4. 创建组件的方法,组件的props属性、state属性的用法和特点,父子组件传值,兄弟组件传值

    1.创建组件的方法   函数组件   class组件 1.1 函数组 无状态函数式组件形式上表现为一个只带有一个 `render()` 方法的组件类,通过函数形式或者 `ES6` 箭头 `functi ...

  5. Angular 父子组件传值

    Angular 父子组件传值 @Input  @Output  @ViewChild 新建一个头部组件 newsheader 在主组件引用 news 组件,在news组件添加 newsheader 组 ...

  6. vue 非父子组件传值

    /*非父子组件传值 1.新建一个js文件 然后引入vue 实例化vue 最后暴露这个实例 2.在要广播的地方引入刚才定义的实例 3.通过 VueEmit.$emit('名称','数据') 4.在接收收 ...

  7. 【vue】父组件主动调用子组件 /// 非父子组件传值

    一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="he ...

  8. vue父子组件传值加例子

    例子:http://element-cn.eleme.io/#/zh-CN/component/form         上进行改的 父传子:用prop:子组件能够改变父组件的值,是共享的,和父操作是 ...

  9. Vue中非父子组件传值的问题

    父子组件传值的问题,前面已经讲过,不再叙述,这里来说一种非父子组件的传值. vue官网指出,可以使用一个空vue实例作为事件中央线! 也就是说 非父子组件之间的通信,必须要有公共的实例(可以是空的), ...

随机推荐

  1. Windows 下 MySQL-python 的安装

    1. 标准方式 进入终端: > pip install MySQL-python 第一次安装(windows 下安装),可能会出错:缺少 vs 编译器,提示点击如下网站 Download Mic ...

  2. 动态加载Layout

    因为现在手头上做的需要显示很多不同布局,想着拆分开来不要全部都写到main.xml里,于是就想到动态加载Layout 目前试了下, LinearLayout page = (LinearLayout) ...

  3. quick-cocos2d-x游戏开发【8】——动画与动作

    动画与动作,在quick中都有对其封装,所以我们还是来看一下吧. 总的来说,对于帧动画,quick封装的方法我们能够常常使用,这是很方便的,以下直接上代码来直观感受下, 比方,14张帧图片,採用coc ...

  4. Get and Post(Unity3D六个发展)

    猴子原创,欢迎转载. 转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=565 unity3d中的www ...

  5. 用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)

    大家都知道PostMessage会丢消息,但是消息队列的大小是多少呢,下面做了一个测试. 代码:   1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, M ...

  6. Oracle召回

    后几集录制视频,记录在记录开始的时候不知道怎么,录了几集没有什么,够又一次录,过程中也也把Oracle数据库这部分看了一遍,收获也挺多的,学习是反复积累的过程,对于一些零散的知识点又回想了一下,又一次 ...

  7. WPF中样式和行为和触发器

    原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...

  8. 关于在.Net开发中使用Sqlite的版本选择问题

    原文:关于在.Net开发中使用Sqlite的版本选择问题 如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不 ...

  9. Selenium-actions

    一.鼠标事件 清单 1. 鼠标左键点击 Actions action = new Actions(driver);action.click();// 鼠标左键在当前停留的位置做单击操作 action. ...

  10. Delphi调试activex

    以前好多次遇到了activex无法调试的问题,一直没搞清楚原因,最近终于搞清楚了,原来是IE由单线程变成了多线程. 下面就说说调试activex的方法 一.简单的方式,这种方式只适用于浏览器为单线程的 ...