2017-01-01 94 views
0

我正在使用add button生成一个动态列表。我可以生成动态列表。但有delete按钮也存在于每个li。我想删除该项目时按下删除按钮。我做一个action以及还原本文首先我不知道如何绑定动态生成list.I单击事件我得到错误,当用户按下删除键如何从列表中删除项目使用删除按钮在反应?

这里是我的代码 https://plnkr.co/edit/JEG6o4JCBIQWAt2A4S3r?p=preview //代码放在这里

const { createStore, bindActionCreators, applyMiddleware,combineReducers } = Redux; 
const { Provider, connect } = ReactRedux; 
const thunk = window.ReduxThunk.default; 


const first_redux =function(state =[] ,action){ 
    switch (action.type){ 
    case 'ADD_ITEM': 
    return [ 
     ...state, 
     action.payload 
     ]; 
     case 'DELETE_ITEM': 
     var index = state.indexOf(action.payload); 
    return state.slice(index,1); 
    default : 
    return state 

    } 
} 

const actions ={ 
addItem :function(item){ 
    return { 
    type :"ADD_ITEM", 
    payload :item 
    } 
} , 
deleteItem :function(item){ 
    return { 
    type :"DELETE_ITEM", 
    payload :item 
    } 
} 

} 
var combindReducer = combineReducers({ 
    item:first_redux 
}) 

const store = createStore(combindReducer); 

class First extends React.Component { 
    constructor (props){ 
    super(props); 
    this.state = { 
     names :[], 
     username :'' 
    } 
    this.changeEv =this.changeEv.bind(this); 
    this.addName =this.addName.bind(this); 
    this.handle =this.handle.bind(this); 

    } 
    changeEv(e){ 
    this.setState({ 
     username : e.target.value 
    }) 
    } 
    addName(){ 
    if(this.state.username !== ''){ 
    this.props.add(this.state.username) 
    this.setState({ 
     username : '' 
    }) 
    } 
    } 
    handle(){ 
    alert('---') 
    } 

    render() { 
    const data =[{"name":"test1"},{"name":"test2"}]; 
    var listItems = this.props.names.map(function(d, idx){ 
     return (<li key={idx}><span>{d}</span><button onClick={this.handle}>delete</button></li>) 
    }) 
    return (
     <div> 
     <input type="text" onChange ={this.changeEv} value={this.state.username}/> 
     <button onClick={this.addName}>add</button> 
     {listItems} 
     </div> 
    ); 
    } 
} 

function mapStateToProps(state){ 
    console.log('================='); 
    console.log(state); 
    return { 
     names: state.item, 

    }; 
    console.log(this.state); 

} 

function mapDispatchToProps(dispatch){ 
    return { 
    add:bindActionCreators(actions.addItem,dispatch) 
    } 
} 
const Appcontainer =connect(mapStateToProps,mapDispatchToProps)(First) 

ReactDOM.render(
    <Provider store ={store}> 
    <Appcontainer/> 
    </Provider> 
    ,document.getElementById('root')); 
+0

该plunkur不工作。当我点击添加,我没有看到生成列表 – Swapnil

回答

1

问题:

您在删除按钮由于你正试图将this.props.names.map内访问得到一个错误,是不是该组件的这一点。

解决方案

var listItems = this.props.names.map((d, idx) => { 
    return (<li key={idx}><span>{d}</span><button onClick={this.handle}>delete</button></li>) 
}) 

由于您使用ES6,您可以使用arrow functions其提供词法范围。我已更新您的代码。检查出来here

+0

那么如何删除元素? – user944513

+0

我已经使用删除功能更新了plunkur。只需将delete操作作为prop提供给mapDispatchToProps中的组件(就像添加元素一样)。 – Swapnil

+0

我已经完成了,感谢您的帮助 – user944513