Par défaut accessoires pour réagir Composant
Je veux que mon application composant a un défaut d'accessoires et d'utiliser que les accessoires en mapStateToProps
.
containers/App.js
import React, { Component, PropTypes } from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import Footer from '../components/Footer';
import TreeNode from '../containers/TreeNode';
import Home from '../containers/Home';
import * as NodeActions from '../actions/NodeActions'
export default class App extends Component {
constructor(props, context) {
super(props, context)
this.props = {
info:{
path:'/'
}
}
}
componentWillMount() {
//this will update the nodes on state
this.props.actions.openNode('/');
}
render() {
const { node , actions} = this.props
console.log(this.props)
return (
<div className="main-app-container">
<Home />
<div className="main-app-nav">Simple Redux Boilerplate</div>
{node.childNodes &&
<div>{node.childNodes.map(node => <TreeNode key={info.path} info={node} tree={tree} actions={actions} />)}</div>
}
{!node.childNodes &&
<div>no children</div>
}
{/*<Footer />*/}
</div>
);
}
}
App.defaultProps = {
info:{
path:'/'
}
};
function mapStateToProps(state, ownProps) {
console.log('state')
console.log(state)
console.log('ownProps')
console.log(ownProps)
return {
node: ownProps.info.path? state.TreeNodeReducer.tree[ownProps.info.path] : {}
};
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(NodeActions, dispatch)
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(App);
reducers/TreeNodeReducer.js
import { OPEN_NODE, CLOSE_NODE, GET_NODES } from '../constants/NodeActionTypes';
import UUID from "node-uuid"
const initialState = {
open: false,
info: {}
}
class NodeModel {
constructor(path, type, right) {
this.name = path;
this.path = path;
this.type = type;
this.right = right;
}
}
let lastId = 0;
function getFileList() {
var testNodes = []
for (var i=0; i< 3; i++) {
testNodes.push(new NodeModel(lastId,'d', i.toString()))
lastId++;
}
return testNodes
}
const getNodes = (state, action) => {
var { path } = action
var tree = state.tree ? state.tree : {}
tree[path] = getFileList(path)
return {
...state,
tree:tree
};
};
export default function (state = initialState, action) {
switch (action.type) {
case OPEN_NODE:
return { ...getNodes(state, action), open:true };
case GET_NODES:
return getNodes(state, action);
case CLOSE_NODE:
return {
...state,
open:false
};
default:
return state;
}
}
J'ai essayé :
1: constructeur
constructor(props, context) {
super(props, context)
this.props = {
info:{
path:'/'
}
}
}
2: des defaultprops:
App.defaultProps = {
info:{
path:'/'
}
};
mais aucun d'eux ne fonctionne...
le journal est toujours:
state
a la bonne valeur par défaut, mais ownProps
est vide...
PS:le Projet est ici .
OriginalL'auteur Mithril | 2016-06-24
Vous devez vous connecter pour publier un commentaire.
1) deux "exportation par défaut"
vous êtes en train de faire deux
export default
enApp.js
.Essayez de changer:
export default class App extends Component
à
const App = class App extends Component
.Et puis:
2) "des defaultprops" et "ownProps":
Comme
mapStateToProps
est appelé avant la construction d'un composant (lorsque des defaultprops sont définies), laownProps
est vide. Vous pouvez essayer les deux options:1) cette solution de contournement:
2) apparemment,
ownProps
premier appel est alimenté avec la ligne définie accessoires. Donc, vous pouvez appeler<App />
de cette façon dans leindex.js
:De toute façon, après la résolution de ce, une autre erreur est levée (
Cannot read property '/' of undefined
) lorsque vous essayez de liretree
du réducteur (il n'y existe pas).export default
comme beaucoup de gens écrire du code comme ça, mais je ne sais pas pourquoi ils écrivent deux.. peut-être est utilisé pour faire différentsimport syntax
compatible .vous ne devez avoir qu'un
export default
par module. Mais peuvent avoir plusieursnamed export
(sans le mot clé default) .Mais la bonne façon de mettre en défaut les accessoires avec de l'es6 syntaxe est la mise
MyComponent.defaultProps = { };
. Ma première pensée était que vous étiez de l'importation d'un non modifiéApp
classe (qui étaient exportés par défaut) et non pas le modifié avec la méthode connect.Comprendre, les pensions de titres, je fourche écrire le code de base comme ça, j'ai supprimer le premier défaut lors de l'astuce. Et pour l'erreur actuelle, une autre idée? Auriez-vous l'esprit pour vérifier mon github github.com/eromoe/simple-redux-boilerplate ?
Désolé, j'ai oublié de mettre à jour le code avant de poster le lien, mis à jour tout à l'heure...
OriginalL'auteur mrlew
J'ai trouvé une meilleure façon de définir des defaultprops,
Parce que
connect()
renvoie à un nouveau composant. Si vous souhaitez des defaultprops pour être présent sur elle, vous avez besoin de mettre des defaultprops:Ce serait le travail!
OriginalL'auteur Mithril