import React, { Component } from 'react';
import './App.css';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import action from './shopcar/reduce/action'
// ui 组件 只取数据
class App extends Component {
constructor(props){
super(props);
this.addfriut = this.addfriut.bind(this);
this.allprice = this.allprice.bind(this);
this.state = {
n: 0
}
};
addfriut(){
this.props.add(this.goods.value,this.price.value);
this.goods.value='';
this.price.value =''
console.log(this.props);
};
allprice(){
console.log(this.props);
let {list} = this.props.myReducer;
let len = list.length;
let n = 0;
for(let i=0; i<len;i++){
n+= list[i].price*this.refs['goods'+i].value||0
}
this.setState({
n
})
}
render() {
let {list} = this.props.myReducer;
return (
<div className="App">
名字:<input type="text" ref={goods=>this.goods=goods}/>
<br/>
价格:<input type="text" ref={price=>this.price=price}/>
<button onClick={this.addfriut}>addfriut</button>
<button onClick={this.allprice}>计算价格</button>
<ul>
{list.map((item)=>{
return (
<li key={item.id}>
<span>
水果:{item.goods} 价格:{item.price}
</span>
<input type="text" ref={'goods'+item.id}/>
</li>
)
})}
{this.state.n}
</ul>
</div>
);
}
}
// // 实现计算属性的操作 类似vuex getters
let mapStateToProps = (state)=>{
return state
};
// // 将dispatch传进去省区了actions 里的方法去 触发action的内置对象
let mapDispatchToProps = (dispatch)=>bindActionCreators(action,dispatch)
export default connect(mapStateToProps,mapDispatchToProps)(App);
// export default App;
shopcar/store.js
import {createStore,applyMiddleware} from 'redux';
import thunk from 'redux-thunk';
import reducer from './reduce';
let store = createStore(reducer,applyMiddleware(thunk));
export default store;
shopcar/reducer.js
import {combineReducers} from 'redux';
import myReducer from './reduce/reducer';
let reducer = combineReducers({
myReducer
});
export default reducer;
shopcar/reduce/state.js
let state = { list:[ { id:0, goods:'橘子', price:6 }, { id:1, goods:'蜜桃', price:7 }, { id:2, goods:'葡萄', price:6 }, { id:3, goods:'香蕉', price:4 } ], count:3 } export default state;
shopcar/reduce/reducer.js
import _state from './state'; let reducer=(state=_state,action)=>{ let newState = {...state}; if(action.type==='ADD'){ action.obj.id = ++newState.count; newState.list.push(action.obj) } return newState; } export default reducer;
shopcar/reduce/action.js
let action = { add(goods,price){ return { type:'ADD', obj:{ goods, price } } }, pre(goods,price){ return (dispatch)=>{ dispatch({ type:'ADD', obj:{ goods, price } }) } } } export default action;
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import {Provider} from 'react-redux'
//React-Redux 提供Provider组件,可以让容器组件拿到state// import App from './power/withRouter'; // import store from './react-redux/store'; import store from './shopcar/store'; // import {BrowserRouter as Router} from 'react-router-dom' import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( <Provider store={store}> <App/> </Provider>, document.getElementById('root')); registerServiceWorker();