javascript

java

python

c#

node.js

android

reactjs

c++

php

jquery

html

css

git

ruby-on-rails

.net

ios

sql

c

string

ruby

reactjs - 阵营renderToString()性能和缓存反应的组分

我注意到,在服务器上渲染大型组件树时,25704277710801080147968方法开始显着减慢速度。

背景

有点背景。 该系统是完全同构的堆栈。 最高级别的clientLoaded组件呈现模板,页面,dom元素和更多组件。 查看一下React代码,我发现它呈现了约1500个组件(这包括被视为简单组件的任何简单dom标签true

在开发中,渲染〜1500个组件大约需要200-300ms。 通过删除一些组件,我能够在约175-225毫秒内获得约1200个组件以进行渲染。

在生产中,大约1500个组件上的renderToString大约需要50-200ms。

时间确实是线性的。 没有任何一个要素是缓慢的,而是许多要素的总和。

问题

这在服务器上产生了一些问题。 冗长的方法导致服务器响应时间长。 TTFB比应有的要高得多。 使用api调用和业务逻辑,响应应该为250毫秒,但是使用250毫秒的renderToString时,响应会加倍! 对SEO和用户不利。 另外,作为一种同步方法,clientLoaded可以阻止节点服务器并备份后续请求(这可以通过使用2个单独的节点服务器来解决:1个作为Web服务器,而1个作为仅提供反应的服务)。

尝试

理想情况下,生产中的renderToString需要5-50ms。 我一直在研究一些想法,但我不确定最好的方法是什么。

想法1:缓存组件

任何标记为“静态”的组件都可以缓存。 通过保留具有渲染标记的缓存,clientLoaded可以在渲染之前检查缓存。 如果找到一个组件,它将自动获取字符串。 在较高级别的组件上执行此操作将节省所有嵌套子组件的安装。 您将不得不用当前的rootID替换缓存的组件标记的react rootID。

理念2:将组件标记为简单/哑巴

通过将组件定义为“简单”,react应该能够在渲染时跳过所有生命周期方法。 React已经为核心React dom组件(clientLoadedtrue等)执行了此操作。 扩展自定义组件以使用相同的优化会很好。

理念3:跳过服务器端渲染上的组件

不需要服务器返回的组件(无SEO值)可以在服务器上直接跳过。 客户端加载后,将clientLoaded标志设置为true,并将其传递下来以强制重新渲染。

结案及其他尝试

到目前为止,我唯一实现的解决方案是减少服务器上呈现的组件数量。

我们正在研究的一些项目包括:

  • React-dom-stream [https://github.com/aickin/react-dom-stream](仍在为测试实现此工作)
  • Babel内联元素[https://babeljs.io/docs/plugins/transform-react-inline-elements/](似乎类似于想法2)

有人遇到过类似的问题吗? 你能做什么?谢谢。

trans by 2019-10-15T13:48:08Z

javascript-推入状态数组的正确方法

我似乎在将数据推入状态数组时遇到问题。我正在尝试以这种方式实现它:

this.setState({ myArray: this.state.myArray.push('new value') })

但是我相信这是不正确的方式,并导致可变性问题?

trans by 2019-10-15T06:23:16Z

javascript-如何存储配置文件并使用R读取

我是React.js的新手,我实现了一个组件,在其中我从服务器获取数据并像这样使用它,

CallEnterprise:function(TenantId){


    fetchData('http://xxx.xxx.xx.xx:8090/Enterprises?TenantId='+TenantId+' &format=json').then(function(enterprises) 
    {
        EnterprisePerspectiveActions.getEnterprise(enterprises);
    }).catch(function()
    {
        alert("There was some issue in API Call please contact Admin");
        //ComponentAppDispatcher.handleViewAction({
        //    actionType: MetaItemConstants.RECEIVE_ERROR,
        //    error: 'There was a problem getting the enterprises'
        //});
    });
},

我想将Url存储在配置文件中,所以当我在测试服务器或生产环境中部署Url时,我只需要更改config文件中的url(而不是js文件中的URL),但是我不知道如何在react.js中使用配置文件

谁能指导我如何实现这一目标?

trans by 2019-10-15T00:15:31Z

javascript-R的大列表性能

我正在用React实现一个可过滤列表。 列表的结构如下图所示。

enter image description here

前提

这是它应该如何工作的描述:

  • 状态驻留在最高级别的组件Search中。
  • 状态描述如下:
{
    visible : boolean,
    files : array,
    filtered : array,
    query : string,
    currentlySelectedIndex : integer
}
  • Result是一个可能非常大的包含文件路径的数组(10000个条目是一个可能的数字)。
  • Result是用户键入至少2个字符后的过滤数组。 我知道它是派生数据,因此可以就将其存储在状态中进行论证,但对于
  • Result是已过滤列表中当前选定元素的索引。

  • 用户在Result组件中输入两个以上的字母,对数组进行过滤,并为过滤后的数组中的每个条目呈现Result组件

  • 每个Result组件都将显示部分匹配查询的完整路径,并突出显示该路径的部分匹配部分。 例如,如果用户键入了“ le”,那么Result组件的DOM将是这样的:

    Result

  • 如果用户在Result组件处于聚焦状态时按下向上或向下键,则Result将基于li阵列进行更改。 这会使与索引匹配的li组件被标记为选中,从而导致重新渲染

问题

最初,我使用React的开发版本,使用足够少的Result进行了测试,并且一切正常。

当我不得不处理Result数组(最多10000个条目)时,就会出现问题。 在“输入”中键入2个字母会生成一个大列表,当我按向上和向下键进行导航时,它会很麻烦。

最初,我没有为Result元素定义组件,而我只是在Result组件的每个渲染中即时制作列表,如下所示:

results  = this.state.filtered.map(function(file, index) {
    var start, end, matchIndex, match = this.state.query;

     matchIndex = file.indexOf(match);
     start = file.slice(0, matchIndex);
     end = file.slice(matchIndex + match.length);

     return (
         <li onClick={this.handleListClick}
             data-path={file}
             className={(index === this.state.currentlySelected) ? "valid selected" : "valid"}
             key={file} >
             {start}
             <span className="marked">{match}</span>
             {end}
         </li>
     );
}.bind(this));

如您所知,每次更改Result时,都会导致重新渲染,并且每次都会重新创建列表。 我以为,因为我已经在每个li元素上设置了Result值,所以React可以避免重新渲染每个其他li731没有改变其className732元素的元素,但是显然不是这样。

我最终为Result元素定义了一个类,在该类中,它根据先前是否被选择以及基于当前用户输入,显式检查是否应重新渲染每个2567330556245705705729元素:

var ResultItem = React.createClass({
    shouldComponentUpdate : function(nextProps) {
        if (nextProps.match !== this.props.match) {
            return true;
        } else {
            return (nextProps.selected !== this.props.selected);
        }
    },
    render : function() {
        return (
            <li onClick={this.props.handleListClick}
                data-path={this.props.file}
                className={
                    (this.props.selected) ? "valid selected" : "valid"
                }
                key={this.props.file} >
                {this.props.children}
            </li>
        );
    }
});

现在,清单是这样创建的:

results = this.state.filtered.map(function(file, index) {
    var start, end, matchIndex, match = this.state.query, selected;

    matchIndex = file.indexOf(match);
    start = file.slice(0, matchIndex);
    end = file.slice(matchIndex + match.length);
    selected = (index === this.state.currentlySelected) ? true : false

    return (
        <ResultItem handleClick={this.handleListClick}
            data-path={file}
            selected={selected}
            key={file}
            match={match} >
            {start}
            <span className="marked">{match}</span>
            {end}
        </ResultItem>
    );
}.bind(this));
}

这使性能稍好一些,但还不够好。 事情是当我在React的生产版本上进行测试时,一切顺利进行,完全没有滞后。

底线

React开发版本和生产版本之间的这种明显差异正常吗?

当我思考React如何管理列表时,我是否理解/做错了什么?

更新14-11-2016

我发现了迈克尔·杰克逊(Michael Jackson)的演示文稿,他在其中解决了一个与此非常类似的问题:[https://youtu.be/7S8v8jfLb1Q?t=26m2s]

该解决方案与下面的AskarovBeknar的答案提出的解决方案非常相似。

更新14-4-2018

由于这显然是一个受欢迎的问题,并且自提出原始问题以来情况已经有所发展,尽管我确实鼓励您观看上面链接的视频,以便掌握虚拟布局,但我也鼓励您使用React Virtualized 库,如果您不想重新发明轮子。

trans by 2019-10-13T10:32:05Z

react jsx-侦听reactjs中文档的按键

我想绑定以关闭escape印刷机上的活动react bootstrap popover。这是代码

_handleEscKey:function(event){
         console.log(event);
        if(event.keyCode == 27){
          this.state.activePopover.hide();
        }
   },

  componentWillMount:function(){
     BannerDataStore.addChangeListener(this._onchange);
     document.addEventListener("click", this._handleDocumentClick, false);
     document.addEventListener("keyPress", this._handleEscKey, false);
   },


   componentWillUnmount: function() {
     BannerDataStore.removeChangeListener(this._onchange);
      document.removeEventListener("click", this._handleDocumentClick, false);
      document.removeEventListener("keyPress", this._handleEscKey, false);
   },

但是,当我按任意键时,控制台中什么都没有记录。 我也尝试在窗口上以及不同情况下使用'keypress','keyup'等来收听,但似乎我做错了。

trans by 2019-10-12T12:35:52Z

JavaScript-错误:无法解析模块“样式加载器”

我正在将样式加载器与webpack和react框架一起使用。 当我在终端中运行webpack时,尽管我已正确指定了文件路径,但import.js文件中却收到Module not found: Error: Cannot resolve module 'style-loader'

import '../css/style.css';
import React from 'react';
import ReactDOM from 'react-dom';
import jQuery from 'jquery';
import TopicsList from '../components/topic-list.jsx';
import Layout from '../components/layout.jsx';

webpack.config.js:

var webpack = require('webpack');
var path = require('path');

var BUILD_DIR = path.resolve(__dirname, 'build');
var APP_DIR = path.resolve(__dirname, 'build');

module.exports = {
    entry: [
      // Set up an ES6-ish environment
      'babel-polyfill',

      // Add your application's scripts below
      APP_DIR + '/import.js'
    ],
    output: {
        path: BUILD_DIR,
        filename: 'bundle.js'
    },
    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                loader: 'babel',

                exclude: /node_modules/,
                query: {
                    plugins: ['transform-runtime'],
                    presets: ['es2015', 'stage-0', 'react']
                }
            },
            { test: /\.css$/, loader: "style-loader!css-loader" }
        ],
        resolve: {
            extensions: ['', '.js', '.jsx', '.css']
        }
    }
};
trans by 2019-10-12T06:56:53Z

reactjs-当使用JSX react / react-in-jsx-scope时,“ React”必须在作用域内?

我是Angular开发人员,是React的新手,这是简单的react Component,但无法正常工作

import react , { Component}  from 'react';
import         { render   }  from 'react-dom';

class TechView extends Component {

    constructor(props){
       super(props);
       this.state = {
           name:'Gopinath'
       }
    }
    render(){
        return(
            <span>hello Tech View</span>
        );
    }
}

export default TechView;

错误:  使用JSX react / react-in-jsx-scope时,“反应”必须在范围内

trans by 2019-10-11T19:01:20Z

reactjs-使用异步componentDidMount()好吗?

在React Native中将AsyncStorage用作异步函数是一种好习惯还是应该避免呢?

安装组件时,我需要从AsyncStorage获取一些信息,但是我知道使之成为可能的唯一方法是使componentDidMount()功能异步。

async componentDidMount() {
    let auth = await this.getAuth();
    if (auth) 
        this.checkAuth(auth);
}

这有什么问题吗,还有其他解决方案吗?

trans by 2019-10-11T04:16:31Z

reactjs-'react-scripts start'命令到底是什么?

我一直在使用react-scripts start处理一个React项目,并且有两个选项可以启动该项目:

第一种方式:

react-scripts start,其定义为package.json,如下所示:

react-scripts start

第二种方式:

react-scripts start

这两个命令有什么区别? react-scripts start的目的是什么?

我试图找到定义,但我只是找到了一个带有名称的包,而我仍然不知道该命令的含义。

trans by 2019-10-11T03:01:58Z

reactjs-如何在VSCode的.js文件中注释掉jsx代码?

与webstorm不同,我无法在Visual Studio Code的.js文件中注释掉jsx代码。

trans by 2019-10-10T04:32:02Z

javascript-重点突出时,如何使用Reactjs选择输入中的所有文本?

例如:[http://codepen.io/Enclave88/pen/YqNpog?editors=1010]

var InputBox = React.createClass({
  render: function() {
    return (
      <input className="mainInput" value='Some something'></input>
    )
  }
});
trans by 2019-10-09T23:27:37Z

javascript-ReactJS:setTimeout()不起作用?

请记住以下代码:

var Component = React.createClass({

    getInitialState: function () {
        return {position: 0};    
    },

    componentDidMount: function () {
        setTimeout(this.setState({position: 1}), 3000);
    },

    render: function () {
         return (
            <div className="component">
                {this.state.position}
            </div>
         ); 
    }

});

ReactDOM.render(
    <Component />,
    document.getElementById('main')
);

难道不应该在3秒后改变状态吗? 它立即改变。

我的主要目标是每3秒更改一次状态(使用setInterval()),但是由于它不起作用,我尝试了setTimeout(),该方法也不起作用。 上面有灯吗? 谢谢!

trans by 2019-10-09T16:09:20Z

reactjs-在Sublime Text 3中,如何为JSX文件启用Emmet?

之前,我一直使用Allan Hortle的JSX包,直到遇到有关如何处理语法突出显示的问题。 然后我注意到有一个官方程序包,崇高反应。

使用Allan Hortle的软件包,他在Preferences > Key Bindings – User中添加了一个片段,以启用Emmet功能,如下所示:

{
    "keys": ["tab"],
    "command": "expand_abbreviation_by_tab", 
    "context": [
        {
            "operand": "source.js.jsx", 
            "operator": "equal", 
            "match_all": true, 
            "key": "selector"
        }
    ]
}

该代码段似乎不适用于正式的sublime-react程序包。 似乎需要对键绑定进行修改,但是对Sublime文档的初步阅读没有引起人们的兴趣。 救命?

trans by 2019-10-08T08:42:10Z

jQuery-使用React上传文件组件

我一直在到处寻找有关制作组件的帮助,以帮助管理从React到我已设置的端点的文件上传。

我尝试了很多选择,包括集成[http://filedropjs.org。]我决定反对,因为我无法控制它在new FileDrop('zone', options);中在DOM中设置的元素

这是我到目前为止:

module.exports =  React.createClass({
displayName: "Upload",
handleChange: function(e){

    formData = this.refs.uploadForm.getDOMNode();

    jQuery.ajax({
        url: 'http://example.com',
        type : 'POST',
        xhr: function(){
            var myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false);
            }
            return myXhr;
        },
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function(data){
            alert(data);
        }
    });

},
render: function(){

        return (
            <form ref="uploadForm" className="uploader" encType="multipart/form-data" onChange={this.handleChange}>
                <input ref="file" type="file" name="file" className="upload-file"/>
            </form>
        );
   }

 });



},
render: function(){

    console.log(this.props.content);

    if(this.props.content != ""){
        return (
            <img src={this.props.content} />
        );
    } else {
        return (
            <form className="uploader" encType="multipart/form-data" onChange={this.handleChange}>
                <input ref="file" type="file" name="file" className="upload-file"/>
            </form>
        );
    }
}
});

如果有人可以指出正确的方向,我会发送一些虚拟的拥抱。 我已经对此进行了广泛的研究。 我觉得我已经接近了,但还没到那儿。

谢谢!

trans by 2019-10-07T02:20:13Z

reactjs-找不到模块:'redux'

我已经使用package.json cli创建了一个新的react应用程序。然后我使用npm install --save react-redux添加了'react-redux'库。

package.json中,我有:

"react-redux": "^4.4.5"

不幸的是,该应用程序无法编译,并且抱怨:

Error in ./~/react-redux/lib/utils/wrapActionCreators.js
Module not found: 'redux' in C:\Users\Salman\Desktop\Courses\Internship\React\Youtube-Front-End\node_modules\react-redux\lib\utils

 @ ./~/react-redux/lib/utils/wrapActionCreators.js 6:13-29

我不知道这是什么意思?

这是完整的容器:

import React,{Component} from 'react';
import {connect} from 'react-redux';

class BookList extends Component{
  renderList(){
        return this.props.books.map((book)=>{
          <li key={book.title} >{book.title}</li>
        });
    }

  render(){

    return(
      <div>
        <ul>
          {this.renderList()}
        </ul>
      </div>
    );
  }
}

function mapStateToProps(state){
  return{
    books:state.books
  };
}

export default connect(mapStateToProps)(BookList);

这是完整的package.json

{
  "name": "Youtube-Front-End",
  "version": "0.1.0",
  "private": true,
  "devDependencies": {
    "react-scripts": "0.6.1",
    "webpack": "^1.13.2"
  },
  "dependencies": {
    "react": "^15.3.2",
    "react-dom": "^15.3.2",
    "react-redux": "^4.4.5",
    "youtube-api-search": "0.0.5"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}
trans by 2019-10-06T18:24:06Z

reactjs-React阻止事件在cli上的嵌套组件中冒泡

这是一个基本组成部分。 <ul><li>都具有onClick功能。 我只希望触发<li>的onClick,而不希望<ul>。如何实现此目标?

我玩过e.preventDefault(),e.stopPropagation()都无济于事。

class List extends React.Component {
  constructor(props) {
    super(props);
  }

  handleClick() {
    // do something
  }

  render() {

    return (
      <ul 
        onClick={(e) => {
          console.log('parent');
          this.handleClick();
        }}
      >
        <li 
          onClick={(e) => {
            console.log('child');
            // prevent default? prevent propagation?
            this.handleClick();
          }}
        >
        </li>       
      </ul>
    )
  }
}

// => parent
// => child
trans by 2019-10-06T04:58:05Z

动画-React-动画化单个组件的安装和卸载

这个简单的事情应该很容易实现,但是我要把它弄复杂。

我要做的就是动画化React组件的安装和卸载。 到目前为止,这是我已经尝试过的方法,以及每种解决方案都行不通的原因:

  1. left: -10000px-我根本不使用CSS类,因为它们都是JS样式,所以这行不通。
  2. left: -10000px-这个较低级别的API很不错,但是它要求您在动画制作完成后使用回调,因此仅使用CSS过渡在此处无法正常工作。 总是有动画库,这引出了下一点:
  3. GreenSock-许可证对于IMO的商业用途过于严格。
  4. React Motion-看起来很棒,但是left: -10000px对于我所需要的东西非常混乱且过于复杂。
  5. 当然,我可以像Material UI一样做一些技巧,在其中呈现元素但保持隐藏状态(left: -10000px),但我宁愿不走这条路。 我认为它很笨拙,并且我希望卸下我的组件,以便它们清理并不会弄乱DOM。

我想要一些易于实现的东西。 在坐骑上,设置一组样式的动画; 卸载时,为一组相同(或另一组)样式设置动画。 做完了 它还必须在多个平台上都具有高性能。

我在这里撞墙了。 如果我缺少某些东西,并且有一种简单的方法可以做到,请告诉我。

trans by 2019-10-06T02:06:02Z

javascript-src目录外的create-react-app导入限制

我正在使用create-react-app。 我试图从import logo from '../../public/images/logo_2016.png'; <img className="Header-logo" src={logo} alt="Logo" />内部文件中的公用文件夹中调用图像。我收到此错误消息。

./src/components/website_index.js找不到模块:您试图   导入../../public/images/logo/WC-BlackonWhite.jpg   在项目src /目录之外。 国外的相对进口   不支持src /。 您可以将其移动到src /中,也可以添加一个   从项目的node_modules /对其进行符号链接。

import logo from '../../public/images/logo_2016.png'; <img className="Header-logo" src={logo} alt="Logo" />

我读过很多东西,说您可以导入路径,但对我来说仍然行不通。 任何帮助将不胜感激。 我知道有很多这样的问题,但是它们都告诉我要导入徽标或图像,因此很明显我在全局图中缺少某些内容。

trans by 2019-10-05T12:19:22Z

reactjs-如何以编程方式更新react-router中的查询参数?

我似乎找不到不使用onChange来使用react-router更新查询参数的方法。/shop/Clothes/dresses?color=blue似乎没有注册查询参数,并且似乎不能将查询对象或其他任何参数作为第二个参数传递。

在不使用<Link>的情况下,如何将URL从onChange更改为/shop/Clothes/dresses?color=blue

onChange函数真的是侦听查询更改的唯一方法吗? 为什么没有自动检测到查询更改并对参数更改做出反应?

trans by 2019-10-04T18:19:06Z

javascript-React-Router只有一个孩子

我继续得到错误:

“路由器”可能只有一个子元素

使用react-router时。

我似乎无法弄清楚为什么它不起作用,因为它就像它们在示例中显示的代码一样:[https://reacttraining.com/react-router/web/guides/quick-start]

这是我的代码:

import React from 'react';
import Editorstore from './Editorstore';
import App from './components/editor/App';
import BaseLayer from './components/baselayer';
import {BrowserRouter as Router, Route} from 'react-router-dom';
import {render} from 'react-dom';

const root = document.createElement('div');
root.id = 'app';
document.body.appendChild(root);

const store = new Editorstore();
const stylelist = ['https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css', 'https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.2/semantic.min.css', 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css', 'https://api.tiles.mapbox.com/mapbox-gl-js/v0.33.1/mapbox-gl.css'];

stylelist.map((link) => {
    const a = document.createElement('link');
    a.rel = 'stylesheet';
    a.href = link;
    document.body.appendChild(a);
    return null;
});

render((
  <Router>
    <Route exact  path="/" component={BaseLayer} />
    <Route path="/editor" component={App} store={store} />
  </Router>
), document.querySelector('#app'));

感谢您的帮助

trans by 2019-10-04T14:20:55Z

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共137页