最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React實(shí)現(xiàn)點(diǎn)擊刪除列表中對(duì)應(yīng)項(xiàng)

 更新時(shí)間:2017年01月10日 15:32:36   作者:晴天_雨天  
本文主要介紹了React 點(diǎn)擊刪除列表中對(duì)應(yīng)項(xiàng)的方法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧

點(diǎn)擊刪除按鈕,刪除列表中對(duì)應(yīng)項(xiàng)本來是React比較基礎(chǔ)的應(yīng)用,可是應(yīng)用情況變得復(fù)雜了以后,我還真想了一會(huì)兒才搞定。

簡(jiǎn)化一下應(yīng)用場(chǎng)景:點(diǎn)擊新增按鈕,增加一條輸入框,點(diǎn)擊輸入框旁邊的按鈕,刪除該輸入框(不能刪錯(cuò)了?。?。

先說第一種方法

問題剛上手,首先規(guī)劃級(jí)別:一個(gè)輸入框和對(duì)應(yīng)刪除按鈕為一個(gè)子組件,整體為父組件即可方便處理。

注意的點(diǎn):生成的一坨輸入框是一個(gè)數(shù)組,為了準(zhǔn)確刪掉對(duì)應(yīng)項(xiàng),生成時(shí)要編號(hào)。點(diǎn)擊刪除按鈕要反饋對(duì)應(yīng)編號(hào),然后進(jìn)行刪除。

現(xiàn)在的邏輯是:整個(gè)待展示列表(由子組件組成的數(shù)組)是個(gè)state,添加按鈕會(huì)增加一個(gè)元素到這個(gè)state里面,添加的方法如下:

add(){
  var lists=this.state.lists;
  lists.push(<List key={this.state.lists.length} index={this.state.lists.length} delete={this.delete}/>);
  this.setState({lists:lists})
 }

注意一點(diǎn),這個(gè)index屬性是固定的,子組建生成后就固定了,這就為你未來挖了一個(gè)坑。

刪除按鈕當(dāng)然就是從這個(gè)state列表里刪除對(duì)應(yīng)元素了,問題一來了,我怎么知道是第幾個(gè)元素?一拍腦袋這還不簡(jiǎn)單,event.target 獲取點(diǎn)擊的標(biāo)簽,在標(biāo)簽上寫個(gè)index屬性告訴delete方法是第幾個(gè)元素不就得了?試了發(fā)現(xiàn)不行,看看文檔,event.target確實(shí)獲取dom元素沒毛病,但是index這個(gè)屬性原生dom根本不承認(rèn)啊,怎么辦?data-index就行了,前面加 data- 就是dom承認(rèn)的自定義屬性了。

寫完了又想起了兩個(gè)方法,一個(gè)是在刪除按鈕綁定刪除事件的時(shí)候,.bind(this,index),index是你準(zhǔn)備刪掉的是第幾個(gè)或者表示出來你要?jiǎng)h哪個(gè)就行。另一個(gè)是搞個(gè)閉包,就能把index參數(shù)傳進(jìn)去了(事件綁定一個(gè)立即執(zhí)行的方程傳入?yún)?shù),該方程返回目標(biāo)方程)。

第一個(gè)問題解決,刪除的方法如下:

delete(e){
  var index=e.target.getAttribute("data-index");
  var lists=this.state.lists;
  lists.splice(index,1);
  this.setState({lists:lists})
 }

data-index告訴你要?jiǎng)h除第幾個(gè)元素,然后把它從state里踢出去就行了。這回掉進(jìn)了一個(gè)真正意義上的坑:有時(shí)候刪的不是對(duì)應(yīng)的元素!亂套了!

好吧,我沉思了5分鐘,想到了為什么:生成列表的時(shí)候index已經(jīng)固定,但刪除列表的時(shí)候我們只告訴他刪除的是第index項(xiàng)!問題嚴(yán)重了,舉個(gè)例子,有兩項(xiàng),index 0和1 你點(diǎn)0,好吧第0項(xiàng)刪掉了,你再點(diǎn)1,疑?沒反應(yīng)了,因?yàn)槟愦蛩銊h除第1項(xiàng),而列表中目前只有第0項(xiàng)(就是原來的第一項(xiàng),原來的第0項(xiàng)刪除后他就成了第0項(xiàng))!這會(huì)導(dǎo)致各種亂套,考慮到生成列表的index是列表長(zhǎng)度表示的就更亂了。

解決方式:delete方法里修改一行:

lists.splice(index,1,"");

好了,刪除的元素我用空字符串代替,這樣順序和刪除的項(xiàng),還有以后添加的項(xiàng)的index都不會(huì)亂了,給自己點(diǎn)贊。到這里第一種方法實(shí)現(xiàn)了目標(biāo)。

Code pen 地址:http://codepen.io/huanqingli/pen/dNyQez

完整代碼:

class List extends React.Component {
 render() {
  return (<div><input type="text" defaultValue={this.props.index}/>
   <span onClick={this.props.delete} data-index={this.props.index}>X</span></div>)
 }
}
class Lists extends React.Component {
 constructor(props) {
  super(props);
  this.add=this.add.bind(this);
  this.delete=this.delete.bind(this);
  this.state={
   lists:[]
  }
 }
 add(){
  var lists=this.state.lists;
  lists.push(<List key={this.state.lists.length} index={this.state.lists.length} delete={this.delete}/>);
  this.setState({lists:lists})
 }
 delete(e){
  var index=e.target.getAttribute("data-index");
  var lists=this.state.lists;
  console.log(index)
  lists.splice(index,1);
  this.setState({lists:lists})
 }
 render() {
  return (<div>
   <span onClick={this.add}>添加</span>
   {this.state.lists}
   </div>)
 }
}
ReactDOM.render(
 <Lists/>,
 document.getElementById('lists')
);

這種方法有利有弊,所以我找到了第二種方法,具體情況擇優(yōu)使用。

第二種方法。總體來講推薦這種方法。

在state里保存要展示的數(shù)據(jù),在render里動(dòng)態(tài)生成子組件組,然后添加刪除都是操作保存數(shù)據(jù)的state,render里的子組件會(huì)自動(dòng)刷新。這種方式應(yīng)該是更貼近React思路的,用數(shù)據(jù)展現(xiàn)界面。如果你要展現(xiàn)一組數(shù)據(jù),這種方法很自然,但如果展現(xiàn)的是一個(gè)動(dòng)態(tài)的表單,稍微麻煩一點(diǎn),但也可以做,而且我依然推薦用這種方式。

這種方法做個(gè)todolist就很簡(jiǎn)單,這里依然做上文的例子,稍微麻煩一點(diǎn),也會(huì)理解的更深入一點(diǎn)。

整體結(jié)構(gòu)和第一種方法一樣,只不過這次state里面不是子組件,先用空字符串組成的數(shù)組代替,僅僅是為了render的時(shí)候知道有幾個(gè)子組件而已。添加的時(shí)候也要push空字符串,等輸入框輸入數(shù)據(jù)后,更新state中的內(nèi)容,做到數(shù)據(jù)和界面同步。

render子組件的部分:

{this.state.lists.map(function (item,index) {
    return <List key={index} index={index} delete={this.delete}/>
   }.bind(this))}

添加的方法變成:

add(){
  var lists=this.state.lists;
  lists.push("");
  this.setState({lists:lists})
 }

這就能跑了,這有個(gè)小坑,稍有不慎你發(fā)現(xiàn)你怎么刪都是刪列表的最后一項(xiàng),其實(shí)數(shù)據(jù)操作沒問題,關(guān)鍵是這個(gè)存在感比較低的key,必須特定項(xiàng)有給定的key你用動(dòng)態(tài)的index他就懵了,不知道刪哪個(gè)了,他就吧最后一個(gè)刪了。廢話不多說(該程序因?yàn)閗ey鍵取值的問題有一個(gè)小問題):

Code pen 地址:http://codepen.io/huanqingli/pen/xgxNYN

整體代碼:

class List extends React.Component {
 constructor(props){
  super(props);
  this.upData=this.upData.bind(this);
 }
 upData(e){
  this.props.upData(this.props.index,e.target.value)
 }
 render() {
  return (<div><input type="text" onBlur={this.upData} defaultValue={this.props.item?this.props.item:""}/>
   <span onClick={this.props.delete} data-index={this.props.index}>X</span></div>)
 }
}
class Lists extends React.Component {
 constructor(props) {
  super(props);
  this.add=this.add.bind(this);
  this.delete=this.delete.bind(this);
  this.upData=this.upData.bind(this);
  this.state={
   lists:[]
  }
 }
 add(){
  var lists=this.state.lists;
  lists.push("");
  this.setState({lists:lists})
 }
 delete(e){
  var index=e.target.getAttribute("data-index");
  var lists=this.state.lists;
  lists.splice(index,1);
  this.setState({lists:lists})
 }
 upData(i,x){
  var lists=this.state.lists;
  lists[i]=x;
  console.log(lists);
  this.setState({lists:lists});
 }
 render() {
  return (<div>
   <span onClick={this.add}>添加</span>
   {this.state.lists.map(function (item,index) {
    return <List key={item?item:index} index={index} delete={this.delete} upData={this.upData} item={item}/>
   }.bind(this))}
   </div>)
 }
}
ReactDOM.render(
 <Lists />, document.getElementById('lists')
)

這種方法經(jīng)常也會(huì)有點(diǎn)小坑,也比較好解決。

總結(jié):兩種方法各有利弊,推薦第二種,符合REACT設(shè)計(jì)思路,但第一種有時(shí)候解決問題很方便。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • React 條件判斷實(shí)例詳解

    React 條件判斷實(shí)例詳解

    在 React 中,可以通過 JavaScript 的條件語句來動(dòng)態(tài)渲染組件或元素,下面給大家分享幾種常用的在 React 中處理?xiàng)l件渲染的方法,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 詳解React如何使用??useReducer???高階鉤子來管理狀態(tài)

    詳解React如何使用??useReducer???高階鉤子來管理狀態(tài)

    useReducer是React中的一個(gè)鉤子,用于替代?useState來管理復(fù)雜的狀態(tài)邏輯,本文將詳細(xì)介紹如何在React中使用?useReducer高階鉤子來管理狀態(tài),感興趣的可以了解下
    2025-02-02
  • react使用axios進(jìn)行api網(wǎng)絡(luò)請(qǐng)求的封裝方法詳解

    react使用axios進(jìn)行api網(wǎng)絡(luò)請(qǐng)求的封裝方法詳解

    這篇文章主要為大家詳細(xì)介紹了react使用axios進(jìn)行api網(wǎng)絡(luò)請(qǐng)求的封裝方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 淺談React 屬性和狀態(tài)的一些總結(jié)

    淺談React 屬性和狀態(tài)的一些總結(jié)

    下面小編就為大家?guī)硪黄獪\談React 屬性和狀態(tài)的一些總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • react-redux的connect示例詳解

    react-redux的connect示例詳解

    connect()是react-redux中的核心方法之一,它將react組件預(yù)redux中的Store真正連接在一起,這篇文章主要介紹了react-redux的connect詳解,需要的朋友可以參考下
    2023-01-01
  • 探究react-native 源碼的圖片緩存問題

    探究react-native 源碼的圖片緩存問題

    本篇文章主要介紹了探究react-native 源碼的圖片緩存問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • React報(bào)錯(cuò)Type '() => JSX.Element[]' is not assignable to type FunctionComponent

    React報(bào)錯(cuò)Type '() => JSX.Element[]&apos

    這篇文章主要為大家介紹了React報(bào)錯(cuò)Type '() => JSX.Element[]' is not assignable to type FunctionComponent解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • react中form.setFieldvalue數(shù)據(jù)回填時(shí) value和text不對(duì)應(yīng)的問題及解決方法

    react中form.setFieldvalue數(shù)據(jù)回填時(shí) value和text不對(duì)應(yīng)的問題及解決方法

    這篇文章主要介紹了react中form.setFieldvalue數(shù)據(jù)回填時(shí) value和text不對(duì)應(yīng)的問題及解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • react中Suspense的使用詳解

    react中Suspense的使用詳解

    這篇文章主要介紹了react中Suspense的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • React?Immutable使用方法詳細(xì)介紹

    React?Immutable使用方法詳細(xì)介紹

    Immutable.js出自Facebook,是最流行的不可變數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)之一。它實(shí)現(xiàn)了完全的持久化數(shù)據(jù)結(jié)構(gòu),使用結(jié)構(gòu)共享。所有的更新操作都會(huì)返回新的值,但是在內(nèi)部結(jié)構(gòu)是共享的,來減少內(nèi)存占用
    2022-09-09

最新評(píng)論

凤冈县| 长沙县| 天峨县| 四会市| 河西区| 云林县| 军事| 庐江县| 农安县| 乌兰浩特市| 河南省| 余江县| 伊春市| 张家港市| 南部县| 岑巩县| 攀枝花市| 广东省| 禹城市| 依安县| 阳曲县| 林周县| 蚌埠市| 建平县| 江阴市| 宜兰市| 东源县| 梅河口市| 徐水县| 河源市| 兴海县| 利辛县| 慈利县| 阳高县| 安图县| 青川县| 遂昌县| 长春市| 临泉县| 鹰潭市| 遂川县|