React技巧6(TodoList实现2组件之间传递数据)

微信公众号首发


本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章!

1.React 技巧1(状态组件与无状态组件的使用) ----2018.01.04

2.React 技巧2(避免无意义的父节点)----2018.01.05

3.React 技巧3(如何优雅的渲染一个List)----2018.01.06

4.React 技巧4(如何处理List里面的Item)----2018.01.07

5.React 技巧5(TodoList实现)----2018.01.08

6.React技巧6(TodoList实现2组件之间传递数据)---2018.01.09(新增)

7.React技巧7(TodoList实现3组件之间传递数据之优化)---2018.01.10(新增)

开发环境:Windows 8,node v8.9.1,npm 5.5.1,WebStorm 2017.2.2

我们看下上节课程 React技巧5(TodoList实现),我们改造下工程,复制出来一份,为demo2

因为是新的页面,我们在 config -> entry -> entry.js 里新增一个json对象,demo2

然后 

npm run devNew

npm run dev

看下浏览器

OK 正常,

我们这节课在这个demo2讲解!

假设我们要实现这样的需求:

1、显示三块内容,全部、未删除、已删除

2、未删除后面有删除按钮

3、已删除后面恢复按钮

最后的效果如下:

好,我们现在开始开发:

1、显示三块内容,全部、未删除、已删除

先把LIst抽出做成List组件

原来是这样:

我们的设计原则是:尽量把增、删、改、查等逻辑方法及状态放在父组件中

List组件只作为展示组件,所有它页是无状态组件!

import Reactfrom 'react';

const List = ({list}) =>

       {

list.map(data => [

data.status ===1 ?

  •                        {data.title}

    this.handleItemDel(data.id)}>删除

                       :

    null

               ])

    }

    ;

    export default List;

    我们在父组件:TodoList中引入 List组件,并把 list状态,及删除方法传递给List组件

    这里面增加了这几句代码:

    import List from './List';

    this.handleItemDel =this.handleItemDel.bind(this)

    相应的页需要改造下List组件代码:

    import Reactfrom 'react';

    const List = ({list,handleItemDel}) =>

           {

    list.map(data => [

    data.status ===1 ?

  •                        {data.title}

    handleItemDel(data.id)}>删除

                       :

    null

               ])

    }

    ;

    export default List;

    这就是父组件给子组件,传递状态及方法的示列!

    子组件接收到父组件状态,进行渲染。用户点击删除,子组件调用父组件删除方法,进行删除。

    我们来把三块内容写出来:

    这里下需要修改下 todoList.pcss

    .todoList {

    .box{

    float:left;

       width:300px;

     }

    li {

    list-style-type:none;

       margin-top:10px;

     }

    button {

    border:1px solid #cccccc;

       border-radius:4px;

       font-size:12px;

       padding:2px 10px;

       margin-left:10px;

     }

    }

    现在三块内容显示的都是一样的,我们来区分一下,那么我们就要给子组件转递一个标识,告诉子组件,当前应该渲染那一部分内容!

    我们设定传一个type 给子组件,并且规定 0 是全部 、1是未删除、2是已删除

       

           全部

       

           未删除

       

           已删除

    然后我们修改下,List组件:

    {

    list.map(data => [

    type ===0 ?

  •                {data.title}

    handleItemDel(data.id)}>删除

               :

    type ===1 && data.status ===1 ?

  •                    {data.title}

    handleItemDel(data.id)}>删除

                   :

    type ===2 && data.status ===0 ?

  •                        {data.title}

    handleItemDel(data.id)}>删除

                       :

    null

       ])

    }

    看下浏览器

    2、未删除后面有删除按钮

    3、已删除后面恢复按钮

    这两个需求我们一起来实现

    首先,未删除的现在有删除按钮,我们先把已删除那块内容,按钮变成恢复按钮,并写上逻辑

    修改 TodoList.jsx

    this.handleItemRecovery =this.handleItemRecovery.bind(this)

    handleItemRecovery(id) {

    let list =this.state.list;

       list.find(data => data.id === id).status =1;

       this.setState({list: list})

    }

       已删除

    看下浏览器

    目前已经可以恢复了!

    我们还得修改下,全部这一块的按钮,

    为了直观一点,我们加上样式!

    .todoList {

    .box{

    float:left;

       width:300px;

     }

    li {

    list-style-type:none;

       margin-top:10px;

     }

    button {

    border:none;

       border-radius:4px;

       font-size:12px;

       padding:2px 10px;

       margin-left:10px;

     }

    .del{

    background-color:#f00000;

       color:#FFFFFF;

     }

    .recovery{

    background-color:chartreuse;

     }

    }

    修改下TodoList.jsx

    修改下List 组件

    {

    data.status ===1 ?

    handleItemDel(data.id)}className="del">删除

           :

    handleItemRecovery(data.id)}className="recovery">恢复

    }

    以上两个组件完整代码如下:

    TodoList.jsx

    import Reactfrom 'react';

    import List from './List';

    import '../../../public/css/todoList.pcss';

    class TodoListextends React.Component {

    constructor(props) {

    super(props);

           this.state = {

    list: []

    };

           this.handleAdd =this.handleAdd.bind(this);

           this.handleItemDel =this.handleItemDel.bind(this);

           this.handleItemRecovery =this.handleItemRecovery.bind(this)

    }

    handleAdd() {

    let item =this.refs['todoInput'].value;

           if (item) {

    let list =this.state.list;

               list.push({id: list.length +1, title: item, status:1});

               this.setState({list: list}, () =>console.log(this.state.list))

    }else {

    alert('不能为空')

    }

    }

    handleItemDel(id) {

    let list =this.state.list;

           list.find(data => data.id === id).status =0;

           this.setState({list: list})

    }

    handleItemRecovery(id) {

    let list =this.state.list;

           list.find(data => data.id === id).status =1;

           this.setState({list: list})

    }

    componentDidMount() {

    }

    render() {

    let {list} =this.state;

           return (

                   

                   添加

                   

                       

                           全部

                       

                           未删除

                       

                           已删除

           );

       }

    }

    export default TodoList;

    List.jsx

    import Reactfrom 'react';

    const List = ({list, handleItemDel, type, handleItemRecovery}) =>

           {

    list.map(data => [

    type ===0 ?

  •                        {data.title}

    {

    data.status ===1 ?

    handleItemDel(data.id)}className="del">删除

                                   :

    handleItemRecovery(data.id)}className="recovery">恢复

                           }

                       :

    type ===1 && data.status ===1 ?

  •                            {data.title}

    handleItemDel(data.id)}className="del">删除

                           :

    type ===2 && data.status ===0 ?

  •                                {data.title}

    handleItemRecovery(data.id)}className="recovery">恢复

                               :

    null

               ])

    }

    ;

    export default List;

    todoList.pcss

    .todoList {

    .box{

    float:left;

       width:300px;

     }

    li {

    list-style-type:none;

       margin-top:10px;

     }

    button {

    border:none;

       border-radius:4px;

       font-size:12px;

       padding:2px 10px;

       margin-left:10px;

     }

    .del{

    background-color:#f00000;

       color:#FFFFFF;

     }

    .recovery{

    background-color:chartreuse;

     }

    }

    我们来看下浏览器效果。

    本文完


    禁止擅自转载,如需转载请在公众号中留言联系我们!

    感谢童鞋们支持!

    如果你有什么问题,可以在下方留言给我们!

  • ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 194,457评论 5 459
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 81,837评论 2 371
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 141,696评论 0 319
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 52,183评论 1 263
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 61,057评论 4 355
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 46,105评论 1 272
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 36,520评论 3 381
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 35,211评论 0 253
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 39,482评论 1 290
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 34,574评论 2 309
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 36,353评论 1 326
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 32,213评论 3 312
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 37,576评论 3 298
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 28,897评论 0 17
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 30,174评论 1 250
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 41,489评论 2 341
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 40,683评论 2 335

    推荐阅读更多精彩内容