小编Dmi*_*dov的帖子

getDefaultProps中的缓存道具是React中的反模式吗?

我正在编写一个复杂的反应应用程序并使用Cortex作为我的中心模型.皮质的哲学是它包装你的数据和更改数据,从根调用完整的重新渲染.这非常有用,尤其是当您有非分层视图更改状态并影响另一个时.

我面临的问题是在重新渲染时保持状态/道具.例如,我有一个特定的层次结构,如下所示:

<Page>
  <EditorCard>
     <Editor/>
     <PublishButton/>
  </EditorCard>
</Page>
Run Code Online (Sandbox Code Playgroud)

EditorCard需要的JavaScript的情况下Editor,为了使更改Editor上单击PublishButton(我用的内外部库Editor,其公开的编辑方法).因此,Editoron 通过调用传递给它的函数ComponentDidMount将实例设置为propon EditorCard.

我的问题是,当我点击PublishButton我更改皮质对象的值,导致从根重新渲染,并为此松开道具Editor(因为组件已经安装ComponentDidMount不再被调用).

我处理这个问题的方法是缓存getDefaultProps.

EditorCard我的默认道具里面是:

  getDefaultProps: function() {
    return {
      cachedData: {},
    }
  },
Run Code Online (Sandbox Code Playgroud)

并将编辑器实例保存为 this.props.cachedData.editor = editorInstance

这可以在多次重新渲染中保存道具.

这是如何使用getDefaultProps缓存的?在通过多次重新渲染保存道具时,我打破了这个黑客的一些核心反应规则?如果是这样,你能建议一个更好的结构?

javascript reactjs react-jsx

8
推荐指数
1
解决办法
5512
查看次数

React-Flux:AppDispatcher.register出错

我正在尝试在Flux-React中设置最基本的应用程序.它的唯一目标是触发一个Action,它通过Dispatcher发送到已经向Dispatcher注册的Store.将商店记录payload到控制台.

除了Store之外的所有东西都运行良好,但是一旦它命中AppDispatcher.register,Flux就会抛出以下错误:

Uncaught TypeError: Cannot set property 'ID_1' of undefined
Run Code Online (Sandbox Code Playgroud)

这是导致错误的文件的代码,但我已经把整个项目放在https://github.com/bengrunfeld/react-flux-dispatcher-error,你可以在src/js中找到有问题的文件/stores/AppStores.js

var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
var AppConstants = require('../constants/AppConstants');
var assign = require('object-assign');


var CHANGE_EVENT = 'change';

var AppStore = assign({}, EventEmitter.prototype, {
  emitChange: function() {
    this.emit(CHANGE_EVENT);
  }
});

AppDispatcher.register(function(payload){
  console.log(payload);
  return true;
})

module.exports = AppStore;
Run Code Online (Sandbox Code Playgroud)

javascript flux react-jsx reactjs-flux

8
推荐指数
1
解决办法
4327
查看次数

React预计将在全球范围内推出

我正在玩带有babel和webpack的React(@ 13.3).

我有一个像这样定义的组件:

import BaseComponent from './BaseComponent';

export default class SomeComponent extends BaseComponent {
    render() {
        return (
            <div>
                    <img src="http://placekitten.com/g/900/600"/>
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

未捕获的ReferenceError:未定义React

我理解错误:JSX位被编译到React.createElement(...)React不在当前范围内,因为它没有导入.

我的问题是:解决这个问题的干净方法是什么?我是否必须以某种方式React通过webpack在全球范围内展示?


解决方案:

我跟着@ salehen-rahman的建议.

在我的webpack.config.js中:

module: {
    loaders: [{
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'react-hot!babel?plugins[]=react-require'
    }, {
        test: /\.css$/,
        loader: 'style!css!autoprefixer?browsers=last 2 versions'
    }]
},
Run Code Online (Sandbox Code Playgroud)

我还需要修复我的测试,所以我将其添加到文件helper.js:

require('babel-core/register')({
    ignore: /node_modules/,
    plugins: ['react-require'],
    extensions: ['.js']
});
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令启动我的测试:

mocha --require ./test/helper.js 'test/**/*.js'
Run Code Online (Sandbox Code Playgroud)

javascript reactjs webpack react-jsx babeljs

8
推荐指数
1
解决办法
1992
查看次数

React Form Component onSubmit Handler不工作

我有以下React组件:

class Form extends React.Component {
  handleSubmit(e) {
    e.preventDefault();

    let loginInput = ReactDOM.findDOMNode(this.refs.login);

    // change Main component's state
    this.props.addCard(loginInput.value);

    // reset the form
    loginInput.value = '';
  }

  render() {
    return(
      <form onSubmit={this.handleSubmit}>
        <input placeholder="githug login" ref="login" />
        <button>Add Login</button>
      </form>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我希望在handleSubmit提交表单时调用该函数.我通过将函数添加到onSubmit处理程序来表明这一点.

该函数正在正确的时间调用.但是,该this函数的值是null.这对我来说是令人惊讶的,因为我预计它的价值this是React Component.thisnull 的事实对我来说是令人惊讶的,因为我正在使用官方React文档建议的非常相似的逻辑/代码.

我很感激帮助找出为什么this不是React组件,如预期的那样,以及如何修复代码.

reactjs

8
推荐指数
4
解决办法
2万
查看次数

使用React.js在JSX中使用for循环创建HTML

我想在JSX中为for循环创建HTML.这是我的尝试看起来像

    function renderTemplates(templates){
           var html = [];
           var templateDiv = [];
           var count  = 0;
           for(var identifier in templates){  
             if(templates.hasOwnProperty(identifier)){
               var templateDetails = templates[identifier];
               if(count == 0){
                  html.push(<Row>);
               }
               cols = <Col md={6}>ff
                          </Col>;
               html.push(cols);
               if(count == 0){
                      html.push(</Row>);
               }
               count = (count === 1)?0:1;
             }
        } 
        return html;
     }
Run Code Online (Sandbox Code Playgroud)

我知道这是错误的语法,但无法弄清楚如何做到这一点.基本上我有一些数据,并希望创建时尚的html,2 divs在1行中.

reactjs react-jsx

7
推荐指数
1
解决办法
1万
查看次数

检查反应元素是否为空

当描述为空时我不想呈现标题

var description = <MyElement />; // render will return nothing in render in some cases

if (!description) { // this will not work because its an object (reactelement)
    return null;
}

<div>
     {title}
     {description}
</div>
Run Code Online (Sandbox Code Playgroud)

什么是正确的方式而不是!描述检查它是否为空?

javascript reactjs react-jsx

7
推荐指数
1
解决办法
2万
查看次数

使用'material-ui'和react-rails gem?

我想在我的Rails 4应用程序中使用material-ui组件库.我目前正在使用react-rails gem将.jsx编译添加到资产管道.我在gemfile中通过rails-assets添加了material-ui,如下所示:

source 'https://rails-assets.org' do
  gem 'rails-assets-material-ui'
end
Run Code Online (Sandbox Code Playgroud)

我在我的application.js文件中需要这样的库:

//= require material-ui
Run Code Online (Sandbox Code Playgroud)

但是我不断收到错误"找不到文件'材料-ui".如何使用react-rails gem在我的Rails应用程序中使用material-ui组件库?

ruby-on-rails asset-pipeline reactjs react-jsx react-rails

7
推荐指数
1
解决办法
3213
查看次数

设置更多参数时如何编写webpack.config.js?

我想处理我的jsx代码,所以我写这样的webpakc.config.js:

{
    test: /\.js$/,
    loaders: ['react-hot', 'babel-loader?presets[]=es2015'],
    exclude: /node_modules/
}
Run Code Online (Sandbox Code Playgroud)

但它没有处理我的jsx代码并抛出这样的错误: 错误扔在终端

通过谷歌,我发现我需要添加presets['react']到我的配置文件.所以我像这样更新配置:

{
    test: /\.js$/,
    loaders: ['react-hot', 'babel'],
    query: {
        presets: ['react', 'es2015']
    },
    exclude: /node_modules/
}
Run Code Online (Sandbox Code Playgroud)

但它引发了另一个错误: 更新配置文件后抛出一个新错误

我是webpack的新手,我该怎么办?

config webpack react-jsx

7
推荐指数
1
解决办法
2280
查看次数

React-router不显示组件

我正在学习react-router,然后尝试在示例应用程序中实现它.

这是我的代码:

的index.html

<!DOCTYPE html>
<html>
    <head>
        <title>Sample APP</title>
        <link rel="stylesheet" href="dist/css/style.css">
    </head>

    <body>
        <div id="main"></div>
    </body>

    <script src="dist/js/main.js"></script>
</html>
Run Code Online (Sandbox Code Playgroud)

/src/app.jsx

var React = require('react');
var ReactDOM = require('react-dom');

var Routes = require('./routes');

ReactDOM.render(Routes, document.getElementById('main'));
Run Code Online (Sandbox Code Playgroud)

/src/routes.jsx

var React = require('react');
var Router = require('react-router').Router;
var Route = require('react-router').Route;
var Link = require('react-router').Link;

var HelloWorld = require('./components/hello-world');
var NotFound = require('./components/not-found');
var About = require('./components/about');

module.exports = (
    <Router>
        <Route path="/" component={HelloWorld}>
            <Route path="about" component={About}/>
        </Route>
    </Router>
);
Run Code Online (Sandbox Code Playgroud)

/src/components/hello-world.jsx

var React …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-jsx react-router

7
推荐指数
1
解决办法
1万
查看次数

类型'typeof __React'上不存在属性'render'

编译脚本时

/// <reference path="./typings/react/react.d.ts" />
import React = __React;

var content = <div>Hello, world!</div>;

React.render(content, document.getElementById('output'));
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

$ tsc --jsx react app.tsx app.tsx(6,7): error TS2339: Property 'render' does not exist on type 'typeof __React'.

有没有办法解决它?谢谢

typescript reactjs react-jsx

7
推荐指数
1
解决办法
4199
查看次数