这是我的情况,我对 react/flux 很陌生,刚刚开始玩弄它。我的玩具项目是一个简单的图书馆应用程序。我目前的状态如下:
- 我有一个名为登录的组件。该组件仅负责存储当前“登录”的用户,以便能够处理库中后面的借/还按钮。因此,用户输入它的名称,该名称将被保存到会话存储中。
- 我的另一个组件称为库,它包含我的应用程序的主要逻辑。
如果我更改当前用户,我正在努力找出如何重新渲染我的库组件。自从这是我的第一个项目以来,我不想玩弄正确的身份验证或创建路由器。所以我只是制作了一个登录表单,每当用户输入他的名字并登录时,我都会将库应用程序渲染到 DOM 上。
Login = React.createClass({
_handleSubmit: function () {
var inp = this.refs.login.getDOMNode();
sessionStorage.setItem("username", inp.value);
console.info('User Credentials saved to SessionStorage');
inp.value = '';
React.renderComponent(
<Library />,
document.querySelector('#content')
);
},
render: function () {
return (
<div className="panel panel-default">
blabla
<button className="btn btn-default" type="button" onClick={this._handleSubmit} >
Login
</button>
blabla
</div>
);
}
});
这很好用,但我认为这远非最佳方法。每当我再次登录时,react 都会将 Library 组件中的新实例重新渲染到 DOM 节点中。我根本不处理解构,我认为这很糟糕:(我知道反应不会追加,而是擦除并填充到节点中,但事件处理程序可能会保留等。
那么对于我的情况,什么可能是一个好的解决方案?
我有 3 种可能的解决方案
- 如果我以不同的用户重新登录以重新呈现自身,我应该开发一个事件系统以便能够通知库组件,或者
- 我可以在 Login & Library 上建立父子关系,所以当我修改 Login 组件的状态时,我的 Library 应用程序也会重新渲染。
- 调用将更新组件的操作
- 坚持当前
:) 感谢您的任何回答,干杯
暗示:
应用程序.js
'use strict';
var React = require('react'),
Login = require('./components/Login.jsx');
// Dev-tools
window.React = React;
React.renderComponent(
Login(),
document.querySelector('#login')
);
登录.jsx
提到鞋面
图书馆.jsx
/** @jsx React.DOM */
'use strict';
var React = require('react'),
BookShelf = require('./BookShelf.jsx'),
Store = require('../stores/Store'),
Library;
/**
* Gets state from Storage
* @returns {{books: BookCollection, users: UserCollection, categories: CategoryCollection}}
*/
function getState() {
var state = Store.getAll();
return {
books: state.books,
users: state.users,
categories: state.categories
};
}
Library = React.createClass({
getInitialState: function() {
return getState();
},
componentDidMount: function() {
Store.addChangeListener(this._onChange);
Store.initialize();
},
componentWillUnmount: function() {
Store.removeChangeListener(this._onChange);
},
_onChange: function() {
this.setState(getState());
},
render: function() {
return (
<div>
<BookShelf
books={this.state.books}
users={this.state.users}
categories={this.state.categories}
/>
</div>
);
}
});
module.exports = Library;