精华内容
下载资源
问答
  • numpy矩阵添加一行或一列
    千次阅读
    2019-08-30 11:45:31

    Tips:要耐心看,不难,也不麻烦…

    基础知识

    np.c_

    将切片对象转换为沿第二轴的连接。
    这是简单的,因为它很常见,所以很有用。特别是,阵列将在升级到至少2-D后沿着它们的最后一个轴堆叠,其中1个后置为形状(由1-D阵列制成的列向量)

    例子


    >>> np.c_[np.array([1,2,3]), np.array([4,5,6])]
    array([[1, 4],
           [2, 5],
           [3, 6]])
    

    np.r_

    np.insert

    np.row_stack

    np.cloum_stack

    快速实现代码

    np.c_ | np.r_代码

    import numpy as np
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    b = np.array([[0,0,0]])
    c = np.r_[a,b]
    d = np.c_[a,b.T]
    print c
    print d 
    

    [[1 2 3]
    [4 5 6]
    [7 8 9]
    [0 0 0]]

    [[1 2 3 0]
    [4 5 6 0]
    [7 8 9 0]]

    • 该方法只能将两个矩阵合并
    • 注意要合并的两矩阵的行列关系

    np.insert代码

    import numpy as np
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    b = np.array([[0,0,0]])
    c = np.insert(a, 0, values=b, axis=0)
    d = np.insert(a, 0, values=b, axis=1)
    print c
    print d
    

    [[0 0 0]
    [1 2 3]
    [4 5 6]
    [7 8 9]]

    [[0 1 2 3]
    [0 4 5 6]
    [0 7 8 9]]

    • 这种是将一个集合插入到一个矩阵中,对于b可以是列表或元组,它仅仅提供要插入的值,但个数要对
    • np.insert的第二个参数是插入的位置,axis用来控制是插入行还是列,可见该方法非常灵活!

    np.row_stack | np.colum_stack 代码

    import numpy as np
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    b = np.array([[0,0,0]])
    c = np.row_stack((a,b))
    d = np.column_stack((a,b.T))
    
    • 类似于c_, r_

    END

    更多相关内容
  • MySql删除表中一行的实操方法

    万次阅读 2021-03-15 14:49:39
    MySql删除表中一行的实操方法首先你要确定能够唯一确定你那一行数据的字段或字段组合是哪些,DELETE FROM 表名 WHERE 字段1 = ‘' and 字段2 = ‘' and ...字段1,...为能够唯一确定某一行数据的字段组合,‘'填写...

    MySql删除表中一行的实操方法

    首先你要确定能够唯一确定你那一行数据的字段或字段组合是哪些,

    DELETE FROM 表名 WHERE 字段1 = ‘' and 字段2 = ‘' and ...字段1,...为能够唯一确定某一行数据的字段组合,‘'中填写你要

    删除的字段具体值就可以了

    如果有主键,则直接利用主键确定某一行就可以了。

    DELETE FROM 表名 WHERE 主键 = ‘具体值'。

    9cea731e33e766cedac00bea84159003.png

    delete from ms_cf01 where brxm='张三' and id='7598';

    其中: ms_cf01 为你所要删除那条数据所属的表。

    brxm,id 为你所要删除数据的条件。

    上面的语句实现的效果是:删除表ms_cf01中,符合brxm等于张三 且 id等于7598的行数据。

    这样就完成了,删除一行的数据操作。

    时间: 2019-05-04

    在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. 禁用外键约束,我们可以使用: SETFOREIGN_KEY_CHECKS=0; 然后再删除数据 启动外键约束,我们可以使用: SETFOREIG

    6b5aa0751a6f1e6a9d0b665a02cc1f46.gif

    一.安装mysql (1)将下载下来的mysql压缩文件解压缩到需要安装mysql的目录中 (2)打开解压后的文件夹,复制default.ini文件并重命名为my.ini,此文件的相关配置为: (3)在系统环境变量配置中的Path变量增加mysql的安装路径 (4)以管理员的身份打开cmd.exe,进入到mysql的安装目录的bin文件里,开始安装 首先输入mysqld -install 安装,然后输入net start mysql 启动服务,然后可以用mysql -u root -p 进入my

    表的创建命令需要: 表的名称 字段名称 定义每个字段(类型.长度等) 语法 下面是通用的SQL语法用来创建MySQL表: CREATE TABLE table_name (column_name column_type); 现在,我们将在 test 数据库中创建以下表. create table tutorials_tbl( tutorial_id INT NOT NULL AUTO_INCREMENT, tutorial_title VARCHAR(100) NOT NULL, tuto

    表relation create table relation( id int primary key auto_increment, userId int not null, fanId int not null ); 插入几条数据 insert into relation(userId,fanId) values(1,1) ,(1,1) ,(1,1), (2,2),(2,2) ,(3,3),(3,3); 表中的数据 id userId fanId 1 1 1 2 1 1 3 1 1 4 2

    sql语句 /* MySQL 消除重复行的一些方法 ---Chu Minfei ---2010-08-12 22:49:44.660 --引用转载请注明出处:http://blog.csdn.NET/feixianxxx */ ----------------全部字段重复------------------------ --1使用表替换来删除重复项 create table test_1(id int,value int); insert test_1 select 1,2 union all

    例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name value 1 a pp 3 b iii 4 b pp 6 c pp 8 c iii 方法1 delete YourTable where [id] not in ( select max([id]) from YourTable group by (name + value)) 方法2 delet

    复制代码 代码如下: CREATETABLE`users`(`id`int(10)NOTNULLAUTO_INCREMENT,`name`char(50)NOTNULL,PRIMARYKEY(`id`)) 复制代码 代码如下: deletefromuserswhereidin(selectmin(id)fromusersgroupbynamehavingcount(name)>1); 结果报错:1093youcan'tspecifytargettable.... 原因是mysql删除动作不能带有

    在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GROUP BY peopleName HAVING count(peopleName) > 1 ) AND peopleId NOT IN ( SELECT min(peopleId) FROM people GROUP BY peopleName HAVING count(peopleName) &gt

    1.如果有ID字段,就是具有唯一性的字段 复制代码 代码如下: delect table where id not in ( select max(id) from table group by col1,col2,col3... ) group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同. 2. 如果是判断所有字段也可以这样 复制代码 代码如下: select * into #aa from table group by id1,i

    本文实例讲述了python统计一个文本中重复行数的方法.分享给大家供大家参考.具体实现方法如下: 比如有下面一个文件 2 3 1 2 我们期望得到 2,2 3,1 1,1 解决问题的思路: 出现的文本作为key, 出现的数目作为value,然后按照value排除后输出 最好按照value从大到小输出出来,可以参照: 复制代码 代码如下: in recent Python 2.7, we have new OrderedDict type, which remembers the order in

    MySQL数据库中查询重复数据 select * from employee group by emp_name having count (*)>1; Mysql  查询可以删除的重复数据 select t1.* from employee t1 where (t1.emp_name) in (select t4.emp_name from (select t2.emp_name from employee t2 group by t2.emp_name having count(*)>1)

    偶尔需要我们比较两个数组,在一个数组中删除另一个数组存在的值.我们常常用的方法是循环比较判断并删除,最近看到另一个好方法巧妙删除的例子: var arr1 = ["i", "b", "c", "d", "e", "f","x"]; //数组A var arr2 = ["a", "b", "c", "

    a132b35263ffcec030f85406d7969cc1.png

    本文为大家分享了两种MySQL删除数据库的方法,供大家参考,具体内容如下 第一种方法:使用 mysqladmin 删除数据库 使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库. 在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失. 以下实例删除数据库TUTORIALS(该数据库在前一章节已创建): [root@

    展开全文
  • 我的新书,《第一行代码 Android 第3版》已出版!

    万次阅读 多人点赞 2020-04-02 10:13:08
    《第一行代码——Android》这本书自2014年出版以来,已经过了6个年头了。期间Android系统版本经历了4.0到10.0系统的巨大升级,开发技术也发生了翻天覆地的变化。2016年的时候,我曾对书的内容进行了大幅度的更新...

    《第一行代码——Android》这本书自2014年出版以来,已经过去了6个年头。期间Android系统版本经历了4.0到10.0系统的巨大升级,开发技术也发生了翻天覆地的变化。在2016年的时候,我曾对书中的内容进行了大幅度的更新,出版了这本书的第2版,也就是所谓的《第二行代码》。而如今,再隔4年之久之后,《第三行代码》终于要以全新的面貌跟大家见面了。

    创作

    不得不说,《第一行代码 第3版》这本书,在出版的过程中经历了太多坎坷,以至于到今天才能跟大家见面。这里先跟所有的读者朋友们说声:对不起,让你们久等了!

    早在2017年,Google在I/O大会上宣布Kotlin将成为Android系统的一级开发语言,从此与Java平起平坐。那时我就猜想到,在Android应用层的开发语言将掀起一场大淘汰式的替换。当时图灵出版社也看到了这个新闻,图灵的编辑很快就联系我,问我准不准备写一本Kotlin方面的书?

    我认为掌握一门语言是需要时间沉淀的,学语法可能两周就能搞定,但要想体会到精髓,则需要不断通过写代码去磨练和提升。那个时候我不认为我具有写好这样一本书的能力,所以也就没有答应。

    长期关注我的朋友应该知道,在这之后的一年多时间里,我把时间基本都放在了GifFun这个开源项目上面。这个项目一开始是使用Java来写的,中途被我切换成了Kotlin。因为我知道,要想熟练掌握一门语言,最好的方式就是不断用它来写代码。我也就借此机会,对Kotlin有了更加深刻的理解。

    到了2019年,我和出版社又重新进行了商讨,准备对《第一行代码》再度更新,推出第3版,这次会将全书的代码都改用Kotlin来实现。但问题在于,Kotlin作为一门新兴语言,程序员基数远不可能有Java那样庞大。如果换了语言之后导致大量读者看不懂怎么办?

    当时出版社提出了一个方案,让我单独再写一本专门讲解Kotlin语言的书,和《第一行代码》配套使用。不过我认为这个方案会提升《第一行代码 第3版》的阅读门槛,就没有答应。

    几经思考之后,我认为想出了一个最佳的写作方案:在一本书里面同时讲解Android和Kotlin这两门技术。这也将会是《第一行代码》中首次引入编程语言的讲解。

    但如何安排这两门技术之间的内容顺序是一件非常有挑战的事情。因为Kotlin是Android程序的开发语言,很显然需要先掌握语言才能开发Android程序。可是如果先花小半本书的篇幅讲解Kotlin,然后再开始学习Android开发,这种学习方式一定非常枯燥,因为学编程语言最怕的就是光学不练。

    为此,我决定采用一种或许别人从未尝试过的方式,将Kotlin和Android穿插在一起讲解。首先使用一个快速入门章节介绍Kotlin的基础知识,然后利用已掌握的知识开始学习Android开发,这样可以做到立刻上手实践。之后的每一章当中,都会结合相当章节的Android内容再学习一些Kotlin的进阶知识,等学完整本书之后,你就能同时熟练地掌握Android和Kotlin这两门技术了。

    这种穿插讲解的方式非常考验我的内容设计能力,因为每章的Android开发中用到的Kotlin知识不能过于超前,不然读者会出现看不懂的情况。同时每章讲解的Kotlin知识又要结合着相应章节的Android知识,这样才能更好地理解该知识点的用法与场景。它们之间的内容是相辅相成的。

    为此,在前期制订目录上面我就花了将近一个月的时间,之后编写Kotlin快速入门这一章又花了两个多月的时间。因为我以前从来没有写过编程语言类的书,为了把Kotlin重要的基础知识在这一章里面都体现出来,我花费了很多心思。在编写这一章的过程中,Google I/O 2019大会上正式宣布了Kotlin First的口号,Kotlin已经不再和Java是平起平坐,而是变成一等公民了。虽然这是我意料之中的事情,但是比我预期来得要早,也让我更加坚定了写好这本书的信心。

    《第一行代码 第2版》是2016年3月份开始动笔的,同年9月份完稿,12月份出版。《第一行代码 第3版》是2019年3月份开始动笔的,但是9月份却远远无法完稿,因为改动内容和新增内容要远比第2版时大得多。我几乎把所有的业余时间都放在了上面,最终在11月底才勉强全书完稿。

    本来是想着好事多磨,好书也不怕晚出版几个月,过完年应该就可以跟大家见面了。没想到,我们恰好碰上了一场从未遇到过的疫情灾难,包括17年前的SARS也没有今天的新冠疫情严重。

    这场疫情导致中国各方面都受到了极大的创伤,学校停课,企业停工,大家都只能呆在家里,不出门就是最安全的。而受疫情的影响,出版社、印刷厂都延迟上班,无法复工。我每天在公众号中都会被读者追问,新书到底什么时候可以出版?这个问题我当时真的无法回答,疫情所带来的影响要持续到何时真的没人知道。

    后来到了三月份,国内的疫情已经逐渐控制住,多数企业也在慢慢复工复产了,这本书才终于能够得以出版印刷。但是,虽然国内的疫情已经缓和,海外疫情却紧接着爆发了起来,截至到我写本篇文章时也没有任何缓和的迹象。现在仍然不知道这场疫情给全球带来的影响要持续到何时,我真心希望你在阅读这篇文章时,新冠已经成为了过去式,每个人都恢复到了正常的生活当中。

    经过了如此多磨难才诞生的这本书,希望能给大家送去更多的知识吧。

    变化

    我相信一定会有很多读者朋友都想问一个问题:《第一行代码 第3版》相比于《第一行代码 第2版》具体有哪些变化呢?在这里我就向大家详细地介绍一下主要的变化部分。

    首先是编程语言上的改变,本书前两版都是使用Java作为应用程序的编程语言,而第3版使用了Kotlin,这也是目前Google最推荐我们使用的编程语言。

    本书的前两版中也没有涉及过语言方面的讲解,默认读者是有Java语言基础的。而第3版中对Kotlin语言进行了非常全面的讲解,不需要读者有任何Kotlin语言的基础。

    另外你需要知道,《第一行代码 第3版》是一本升级版的书,而不是一本全新的书,因此书中整体的知识架构仍然和《第一行代码 第2版》是保持一致的。

    虽然整体知识架构不变,但还是涉及了一些章节上的变动。

    第3版中移除了之前第2版中的11、15两章内容。这两章内容分别讲解的是LBS开发、以及App上架。

    LBS开发其实主要讲解的都是百度地图SDK的用法,但是百度地图SDK很可能会频繁更新,而书中的内容却是不能随意改变的,所以我认为这部分内容更应该去百度地图的开发者官网进行学习。

    至于App上架主要讲解的是360应用商店的上架过程,由于现在国内的App上架已经变得非常复杂,个人开发者都需要专门去申请软件著作权才能将自己开发的App上架到应用商店,书中的内容已经不再适用,所以也进行了移除。

    而第3版中新增了三章内容,分别是第2章、第13章和第16章。

    第2章就是之前提到的Kotlin快速入门章节,这一章将会带你迅速上手Kotlin编程,讲解了如变量、函数、逻辑控制、面向对象编程、Lambda编程、空指针检查等Kotlin中最基础、同时也是最核心的知识点。学完了这一章内容之后,你就可以使用Kotlin来编写一些Android程序了。

    第13章是专门讲解Jetpack的一个章节。Jetpack是Google于近年推出的一个开发组件工具集,旨在帮助我们编写出更加符合高质量代码规范、更加具有架构设计的应用程序。是的,现在我们已经不能停留在实现功能就万事大吉的层面了,而是要在实现功能的同时,追求更高的代码质量和架构设计。第13章中讲解了ViewModel、Lifecycles、LiveData、Room、WorkManager等内容,基本涵盖了Jetpack架构模块当中最主要的一些组件。

    第16章是第3版中新补充的一个实战章节。本书的前两版中都只有一个实战章节,而第3版中会有两个实战章节。不同于过去的App开发实战,第16章会带你一起编写并发布一个开源库。因为我之前也写过几个比较知名的开源项目,并且我在公司的主要工作就是SDK方面的研发,所以其实我很擅长写这部分内容。还有什么事情是比在别人的项目中看到引用了自己的开源库更让人激动的呢?

    介绍完了整体章节上的变动,我们再来看一些具体内容上的变化。

    为了响应Google的Kotlin First号召,第3版中将全书所有的代码都改成了使用Kotlin语言来进行实现,Android的持续Kotlin化也是未来长期发展的必然趋势。不过,由于新增的第2章只是讲解了一些Kotlin的基础内容,为了能够让你更加全面地掌握Kotlin方方面面的知识,第3版几乎在每一章的最后都加入了一个Kotlin课堂的环节。全书一共有12节Kotlin课堂,全面涵盖了诸如常用技巧、高阶函数、泛型、协程、DSL等等语言层面的知识,绝对足以让你熟练掌握Kotlin这门语言了。

    除了在编程语言方面存在大量的变动之外,Android开发方面当然也不会一成不变。自《第一行代码 第2版》出版之后,Android又经历了8 9 10系统的快速迭代。每个新系统版本中都会增加一些崭新的特性,也都需要进行一些开发方面的适配,第3版将这些内容全部涵盖了进去。

    另外,近些年来追求架构设计的开发者越来越多,类似MVP、MVVM等架构的使用也越来越广泛,传统的MVC架构逐渐在被抛弃。第3版的第15章中对MVVM架构进行了非常详细的讲解,并且配合着Google提供的Jetpack组件,最终完成了一个MVVM架构的天气预报程序。虽然这个天气预报程序我已经写了3版了,但是这次将会是最具架构性,也最符合高质量编码规范的版本。相信会对你未来开发公司的实际项目带来很大的帮助。

    除了上述主要变化之外,还有许多小细节方面的变动这里就不一一列举了,等待你自己阅读的时候发现吧。

    设计

    虽说这是一本升级版的书,可我花费在上面的时间和精力丝毫不亚于写一本新书。所以,不管是在内容方面还是在设计方面,我都希望它和第2版能够有着更加明显的区别。因此,图灵的设计师们这次也辛苦了。

    首先是封面的设计,和第2版时一样,这次第3版的封面也是由图灵的设计师做出了几个版本,然后我在公众号上发起了一个投票,让广大读者朋友们共同选出最满意封面,投票结果如下:

    最后蓝色封面以压倒性的优势当选,《第一行代码》也终于把红绿蓝这三元色全部凑齐了。第3版的封面正式确定:

    然后是书签,第2版中首次在书里附赠了书签,那么第3版当然会把这个好传统继续坚持下去了。书签的设计应该尽可能地展现出一本书的特点,而我认为《第一行代码 第3版》最大的特点就是两部分:Android 10和Kotlin。所以我也让设计师专门为这两个主题设计了两种书签,我们来一起欣赏一下吧:

         

    每本书中都会赠送这两个书签,虽然一本书送两个书签可能有点多余,但我觉得这会给人一种更加完整的感觉。

    除此之外,第3版中还首次提供了全书知识架构的思维导图。这是我根据书中主要知识点进行整理,并由本书编辑张霞绘制出来的,共分为Android和Kotlin两张图。

    思维导图可以方便你纵览本书Android和Kotlin的宏观图景,帮助你梳理各章的知识要点。

    Android的思维导图如下:

    Kotlin的思维导图如下:

    这两张思维导图都会以彩页的形式装订在书中,方便你随时查看。

    最后是给高校老师们的福音,由于本书前两版被大量高校当作教材使用,这次为了便于高校老师和培训机构教学,第3版中专门配备了相应的PPT课件。在书中的前言部分附有所有随书资源的下载地址。

    定价

    我之前发现有部分读者朋友对书的定价方式是有误解的,所以这里先来科普一下。

    任何一本书,都是要以成本为依据来定价的,而不是内容。成本指的主要是这本书印刷所需花费的费用,所以页数多的书一定比页数少的书贵,彩色页的书一定比黑白页的书贵。

    在我之前的一篇文章中,有些读者留言,认为一本书应该是根据内容的好坏来定价,其实这是不可能的。也许会存在一些好书因为口碑特别好而提高定价,但一定不会存在一本差书因为自我感觉内容比较差而主动降低定价。

    由于《第一行代码 第3版》新增了许多Kotlin方面的知识讲解,书的总页数也从第2版时的500多页变成了现在的700多页,所以涨价是在所难免的事情。

    一开始本书编辑张霞建议将第3版售价定为99元,我觉得相比于第2版的79元涨幅有点高,问她可不可以降低到89元。她告诉我,700多页的书定价89元有很大概率会被出版社打回,但她仍然以这个价格上报了试试。果不其然,最终这个定价审核没有通过,因为市面上700多页的书定价都至少在100元以上。

    最终我也做出了让步,同意将第3版定价为99元,至少控制在了百元以内。不过这仅仅只是书的定价,而通常我们在网上买书都是有折扣的。具体折扣的多少由各网店自己决定,我参与不了,但一般也就是七八十块钱就能买到了。

    购买

    了解了这么多,不知道你有没有决定要买一本呢?目前《第一行代码 第3版》已经在京东、当当等网上书店开启预售了,限量签名版先到先得,有需要的小伙伴们请点击下面的链接。另外全书的完整目录,也可以到下面的链接页面进行查看。

    京东购买地址

    当当购买地址

    天猫购买地址


    关注我的技术公众号,每天都有优质技术文章推送。

    微信扫一扫下方二维码即可关注:

    展开全文
  • 这几天基于react写了一个小demo测试,主要实现的功能是:输入框输入文字,点击添加按钮,下方的表格会自动添加一行数据,点击删除按钮后,该行数据被删除。  先来看看最后的效果图:  操作前  操作...

        这几天基于react写了一个小demo测试,主要实现的功能是:在输入框中输入文字,点击添加按钮,在下方的表格中会自动添加一行数据,点击删除按钮后,该行数据被删除。

        先来看看最后的效果图:

        操作前

        操作后

      

        可能样式没怎么调,看着有点别扭,表格样式扒的是菜鸟教程上的,觉得还行的也可以用这个样式哦,或者改成自己喜欢的即可,最重要的是功能实现就好。

        1.开发环境搭建

        这个在这里我们就不细说了,npm及node.js的安装是前提哦!

        国内使用 npm 速度很慢,你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

    $ npm install -g cnpm --registry=https://registry.npm.taobao.org
    $ npm config set registry https://registry.npm.taobao.org

        create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境。

        create-react-app 自动创建的项目是基于 Webpack + ES6 。

        执行以下命令创建项目:

    $ cnpm install -g create-react-app
    $ create-react-app my-app
    $ cd my-app/
    $ npm start

        其中my-app就是你自己的项目名字,如果已经创建好项目,按着提示启动项目即可。若是之前就已经创建好了项目,直接进入项目的目录,输入命令:npm start启动项目就OK啦!

        在浏览器中打开http://localhost:3000/就是我们项目运行的地址。

        创建好的项目目录结构如下:

          

        2.修改src/App.js文件

        manifest.json 指定了开始页面 index.html,一切的开始都从这里开始,所以这个是代码执行的源头。

        我最后的文件目录如下:

        

        在index.js里面,我们可以将ReactDOM.render做一点改变,如下:

    ReactDOM.render(
        <App />,
        document.getElementById('container')
    );

        下面的那个id就是我们自己在index.html里定义的div的id,那么主要问题来了,在App.js中,这个逻辑要怎么理清呢?

        首先,对于主体结构,我们应该是没有什么疑问的,无非就是input输入框和按钮。要完成我们的需求,需要两个方法,分别是添加和删除。

        其次,对于表格中的数据,我们可以通过一个数组去储存它。点击添加按钮时,就向数组中添加一个元素;点击删除按钮时,将该元素从数组中删除。

        至此,思路应该还是相对清晰了,那我们来一起看看代码吧:

    let i=0;
    
    class App extends React.Component {
        constructor(props) {
            super(props);
            this.add=this.add.bind(this);
            this.delete=this.delete.bind(this);
            this.state={
                lists:[]
            }
        }
    
        add(){
            const lists=this.state.lists;
            const info = document.getElementById("add").value;
            lists.push({"id": ++i,"value":info});
            this.setState({lists:lists})
        }
    
        delete(e){
            const index=e.target.getAttribute("data-index");
            const lists=this.state.lists;
            document.getElementById(index).remove();
            this.setState({lists:lists})
    
        }
    
        render() {
            return (
                <div>
                    <input type="text" id="add"/>
                    <button onClick={this.add}>添加</button>
                    <table id="customers">
                        <tbody>
                        <tr>
                            <th>内容</th>
                            <th>操作</th>
                        </tr>
                        {this.state.lists.map((data)=>{
                            console.log(data);
                            return <List key={data.id} index={data.id} info={data.value} delete={this.delete}/>
                        })}
                        </tbody>
                    </table>
                 </div>
            )
        }
    }
    
    export default App;

        add()方法中,info是为了获取我们输入的内容,再将其添加到lists数组中,而这里添加id属性,则是为了删除方便,直接获取元素的下标,通过获取其下标移除元素。

        3.自定义组件List

        它主要传达的就是我每一行的元素,直接上代码:

    class List extends React.Component {
        render() {
            return (
                <tr id={this.props.index} className="alt">
                    <td>
                        <input type="text" defaultValue={this.props.info} />
                    </td>
                    <td>
                        <button onClick={this.props.delete} data-index={this.props.index}>删除</button>
                    </td>
                </tr>
            )
        }
    }

        4.表格样式

        最后要解决的就是样式问题啦,当然,大家还是自定义就好了。这个样式可能是有点奇怪,不过觉得看的过去的伙伴还是可以将就一下滴!

        嗯嗯,这个样式放在css里,要用的时候直接导进去就好了。

    #customers
    {
      font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
      width:30%;
      border-collapse:collapse;
    }
    #customers td, #customers th
    {
      font-size:1em;
      border:1px solid #98bf21;
      padding:3px 7px 2px 7px;
    }
    #customers th
    {
      font-size:1.1em;
      text-align:left;
      padding-top:5px;
      padding-bottom:4px;
      background-color:#A7C942;
      color:#ffffff;
    }
    #customers tr.alt td
    {
      color:#000000;
      background-color:#EAF2D3;
    }

      到了这里,表面上我们的需求已经得到实现,但事实上,这里面还存在着许多漏洞。细心的小伙伴们会发现,在我们删除元素的时候只是单纯的把元素移除掉了,也就是说,只是页面上看不到了,但实际的元素仍然存在数组中。所以,我们实际上需要删除的是数组里面的元素,通过splice可删除数组中的元素。

      接下来,我们将通过Ant Design组件实现点击按钮,增加一行数据的需求,先来看看最后的效果图:

      操作前:

      

      操作后:

      

      emm,这个效果看起来确实要比之前的舒服,在项目开始之前,我们需要部署好我们的环境,这个时候除了之前下载的依赖,还需要使用npm或yarn安装:

    $ npm install antd --save

      或

    $ yarn add antd

    这里忘了说一句,这里也需要redux的环境部署,所以还需要 npm install redux命令。  

    下一步需要做什么呢?先看看我们的目录结构,方便梳理我们要做的是什么:

      这里我们的文件命名和方法其实也涉及到了redux,但这并不影响我们的理解,简单来说,actions表示的是动作指令,定义事件的state,reducers里定义的函数通过action触发,component中定义的是组件。当然了,他们之间的交互关系,建议大家可以去看看官方文档:

      

      A:目录清楚后,首先看入口文件index.js:

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import TodoList from './component/TodoList';
    
    ReactDOM.render(
        <TodoList />,
        document.getElementById('root')
    );

      我想,这里就不用多解释了,render一个自定义组件TodoList,然后将其在页面中渲染出来。

      B:组件TodoList中我们主要是定义了四个方法,分别是

    (1)handleInputChange:获取输入类型和input的值
    (2)handleStoreChange:获取最新的数据
    (3)handleBtnClick:点击按钮后添加数据
    (4)handleItemDelete:删除数据

      具体代码如下:

    class TodoList extends Component{
        constructor(props){
            super(props);
            // 获取store里的所有state数据
            this.state = store.getState();
            store.subscribe(this.handleStoreChange)
        }
    
        handleInputChange = (e) => {
            // 获取输入类型和input的值
            // const action = {
            //     type: 'CHANGE_INPUT_VALUE',
            //     value: e.target.value
            // }
            const action = getInputChangeAction(e.target.value);
            // 把action传给store
            store.dispatch(action);
            // store自动传给reducer
        }
    
        // reducer返回newState之后,store传递给newState给组件
        handleStoreChange = () => {
            // 获取最新的数据
            this.setState(store.getState());
        }
    
        handleBtnClick = () => {
            // const action = {
            //     type: 'ADD_TODO_ITEM'
            // };
            const action = getAddItemAction();
            store.dispatch(action);
        }
    
        handleItemDelete = (index) => {
            // const action = {
            //     type: 'DELETE_TODO_ITEM',
            //     index: index
            // };
            const action = getDeleteItemAction(index);
            store.dispatch(action);
        }
    
        render(){
            return (
                <div style={{margin:'10px',marginLeft:'10px'}}>
                    <div>
                        <Input
                            value={this.state.inputValue}
                            placehoder="todo list "
                            style={{width:'300px'}}
                            onChange={this.handleInputChange}
                        />
                        <Button
                            type= "primary"
                            onClick={this.handleBtnClick}
                        >提交</Button>
                    </div>
                    <List
                        style={{marginTop:'10px',width:'300px'}}
                        bordered
                        dataSource={this.state.list}
                        renderItem={(item,index) => (
                            <List.Item>
                                <span style={{position:'relative'}}>{item}</span>
                                <Button style={{position:'absolute',right:'8px',top:'8px'}} onClick={this.handleItemDelete} >删除</Button>
                            </List.Item>
                            )
                        }
                    />
    
                </div>
            )
        }
    }
    
    export default TodoList;

      C:其中,getInputChangeAction、getAddItemAction和getDeleteItemAction三个方法,来源于我们的actionCreator.js中的自定义函数:

    export const getAddItemAction = () => ({
        type: ADD_TODO_ITEM
    });
    
    export const getInputChangeAction = (value) => ({
        type: CHANGE_INPUT_VALUE,
        value: value
    });
    
    export const getDeleteItemAction = (index) => ({
        type: DELETE_TODO_ITEM,
        index: index
    });

      D:定义的type是来自我们的actionTypes.js,其实,我们也可以把它合并在一个js里,具体怎么写,还是看个人习惯啦。

    export const ADD_TODO_ITEM = 'add_todo_item';
    export const CHANGE_INPUT_VALUE = 'change_input_value';
    export const DELETE_TODO_ITEM = 'delete_todo_item';

      E:最后要说的是在TodoList中我们用到的store是来源于reducers文件夹下的index.js封装的store。

    const store = createStore(
        reducer
    );
    
    export default store;

      F:reducers文件夹下的reducer设置的是一个默认状态

    import {CHANGE_INPUT_VALUE,ADD_TODO_ITEM,DELETE_TODO_ITEM} from '../actions/actionTypes';
    
    const defaultState = {
        inputValue: '',
        list: []
    };
    
    export default (state=defaultState,action)=>{
        //input
        if (action.type===CHANGE_INPUT_VALUE){
            const  newState=JSON.parse(JSON.stringify(state));
            //简单的深拷贝
            newState.inputValue=action.value;
            return newState;
        }
    
        //button
        if (action.type===ADD_TODO_ITEM){
            //把老数据拷贝一份
            const  newState=JSON.parse(JSON.stringify(state));
            //在列表中新加输入框内容
            newState.list.push(newState.inputValue);
            //点击提交之后,输入框清空
            newState.inputValue='';
            // console.log(newState);
            //返回给store
            return newState;
        }
    
        //点击删除
        if (action.type===DELETE_TODO_ITEM){
            const newState=JSON.parse(JSON.stringify(state));
            newState.list.splice(action.index,1);
            return newState;
    
        }
        return state;
    }

     

    展开全文
  • shell脚本三剑客,awk、grep、sed转自:https://blog.csdn.net/lml282518588/article/details/52918765sed是个很好的文件处理工具,本身是个管道命令,主要是以行为单位进行处理,可以将数据进行替换、删除、...
  • 幸好有人专门做这类事情,将科学计算所需要的模块都编译好,然后打包以发行版的形式供用户使用,Anaconda就是其中个常用的科学计算发行版自带的包管理器conda也非常强大,甚至支持多个版本的 Python 共存主页...
  • 1.创建目录/dzqc 提示: windows下的路径样式为c: \dzqc\ test,而linux下的路径样式为 /dzqc/test 因此/dzqc就可以看做是c:\dzqc,不同的是 windows系统下还有D,E等盘, linux下就只有/为所有目录的顶点。 英文 ...
  •  //删除一行内容(java本身没有删除的方法,本方法通过先读取文件的内容(需删除的行数除外),放到list重新写入)  /*int line = 2;  int num = 0;  BufferedReader br = new BufferedReader(new ...
  • Jupyter Notebook的文档添加索引目录,方便快速查找编辑内容模块。 配置流程 1.安装扩展包 jupyter_contrib_nbextensions pip install jupyter_contrib_nbextensions 2.配置 nbextensions # 这个地方...
  • 本人是按照《第一行代码》来学习Android开发的。但是此书是2016年出版,至今到2019年谷歌公司也不断对AS进行更新。如方法的废弃或改进、依赖的更新等。 于是本人将学习遇到的问题和解决方法统一记录这。 ...
  • 可以参考这篇https://blog.csdn.net/pxy198831/article/details/87931765 遇到的一些问题 1. 目录的字体依赖正文的字体 问题描述:修改自定义目录之后,目录的字体样式仍没有变化,而且随着正文相应的文字字体...
  • word文档如何添加目录

    千次阅读 2018-08-03 14:28:23
    文档选择将在目录中显示的内容,将之设置为“标题1”、“标题2”或“标题3”等。其中“标题1”代表级标题,应为顶级目录,“标题2”为二级标题,层次在一级标题之下,而“标题3”又二级标题之下,以下级别...
  • 给txt格式的文档增加目录

    千次阅读 2021-06-23 08:53:01
      实际使用, 我总结出了种让txt生成目录的方法, 虽然较粗略, 但却可以大大减轻我们查找文档内容时的不便. 下面我把它分享出来, 既希望对大家有所帮助, 也希望能够抛砖引玉, 让其能够更加完善.(这种方法目前...
  • 先将两张图片均导入word中,位置设置为“嵌入文本行中”,调整t图片大小使得两图片刚好可以呈现同一行。如果图片不需要题注,或者两图片共用个题注,那么就此就可以了;而如果两图片各自要有题注,则继续进行...
  • 【Latex学习】生成pdf加入书签/目录/提纲【Latex学习】生成pdf加入书签/目录/提纲生成目录生成pdf书签/目录/提纲 - 方法1生成pdf书签/目录/提纲 - 方法2去掉书签/目录/提纲 【Latex学习】生成pdf加入...
  • pandas为dataframe添加新的数据行(rows)、dataframe后面纵向添加一行数据(数据为列表list形式)、列有不匹配将会使用NA值进行填补 目录 pandas为dataframe添加新的数据行(rows)、dataframe后面纵向添加...
  • 小白基于guolin大神第一行代码CoolWeather开发 文章目录小白天气开发练习数据来源CoolWeather目录结构 数据来源 通过和风天气获取天气预报 https://id.heweather.com/ 全国省市县数据 http://guolin.tech/api/china ...
  • 我的笔记本win7桌面上有3个...目标:点击V6.bat 实现从V8.txt 循环获取每一行的字符串,然后赋值给变量,重定向写入vip.txt . 我说清楚了吧。 1. 先看V8.tx内容:6个IP地址。 2. 看V6.bat内容: 3. 点击 V...
  • 、数据表数据的增加(插入) 二、数据表数据的查询 三、数据表数据的修改 四、数据表数据的删除   零、码仙励志 伟人所达到并保持着的高处,并不是一飞就到的,而是他们同伴们都睡着的时候,...
  • YII2 增加自定义目录结构

    千次阅读 2016-03-16 18:19:37
    原文:...YII2高级版增加自定义目录结构 工具/原料 YII2 ...1、首先要common的目录里面的config/bootstrap文件里面增加一行对应的配置文件 例如:Yii::
  • Flutter项目目录结构及demo代码详解

    万次阅读 多人点赞 2018-12-11 14:54:03
    之前的博客我们搭建了Flutter的开发环境,并且创建了项目,项目默认就生成了一些代码,学习任何语言第步一般都是从入口函数着手,然后一步一步往下走。 本篇博客我们就以默认生成的项目为准,着重的介绍...
  • 最近编译androdi5.1代码的时候突然发现虚拟机容量不够了,很是蛋疼,只好摸索如何想办法给相应目录增加容量,以下方法亲测可行!1.第步当然是增加硬盘容量了,这个需要用到VMware的安装目录下可执行文件 vmware-...
  • 二、增加一块硬盘并进行分区和挂载 三、详细操作步骤 一、linux分区介绍 1.原理介绍 1)对于Linux来说无论有几个分区,分给哪一个目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux每个...
  • 目标:增加新磁盘第步:VMware上增加新磁盘第二步:重启一下!(非常重要!不要疏忽了)第三步:给磁盘分区首先查看一下磁盘分区情况磁盘分区磁盘格式化磁盘挂载 1.目标: 学会增加磁盘 学会磁盘挂载 增加新磁盘 第...
  • 文章转载自 zjm12343 的 Android Studiolayout目录分类 Android Studio layout layout 目录分类 第步: res/layout文件夹下创建自己想要的目录(有几个模块就建几个目录) 第二步: ...
  • 如果你一行文字前也想要添加编号,那么只需要点一次多级列表,它出现1.以后自己按tab键选择需要的编号级数; 3.当你每一级都弄好以后(如上图所示),你可以设置每一级的项目符号和编号,你只需要鼠标点击对应...
  • 如何用一行C++代码读写数据库

    万次阅读 2017-08-01 16:48:42
    这篇文章要表达的并非数据库相关的知识,而是如何使用DBIOWrapper。 DBIOWrapper是一个工作Windows下、对ODBC式数据访问进行了小型... 文章标题《如何用一行C++代码读写数据库》是伪命题,要操作数据库我们通常
  • 算是爬虫对庞大的数据进行预处理的很重要的一步。 经过段时间的工作不断完善,功能上基本实现了我的预期。...1. 合并csv文件(cmd进行操作) cat *.csv>all.csv 或者 cat 1.csv ...
  • 操作系统作业:给linux系统增加一个系统调用

    万次阅读 多人点赞 2018-06-01 00:43:37
    前不久开了一门《操作系统》,老师上课留下了个作业——给Linux系统添加个系统调用。刚开始只能用脸懵逼来形容,只能硬着头皮做下去。由于刚的新电脑,所以就没敢装双系统。所以我选择了虚拟机,虚拟机刚开始...
  • DataFrame对行列求和并添加新

    千次阅读 2020-07-03 12:10:17
    这里写自定义目录标题 计算各数据总和并作为新添加到末尾 week_time_group_table.loc['Col_sum'] = week_time_group_table.apply(lambda x: x.mean()) 示例效果: 计算各列数据总和并作为新列添加到末尾 df['...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593,997
精华内容 237,598
关键字:

怎么在目录中增加一行