javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

reactjs-React setState不立即更新

我正在做一个待办事项应用程序。 这是违规代码的非常简化的版本。 我有一个复选框:

 <p><input type="checkbox"  name="area" checked={this.state.Pencil}   onChange={this.checkPencil}/> Writing Item </p>

这是调用复选框的函数:

checkPencil(){
   this.setState({
      pencil:!this.state.pencil,
  }); 
  this.props.updateItem(this.state);
}

updateItem是映射为分派到redux的函数

function mapDispatchToProps(dispatch){
  return bindActionCreators({ updateItem}, dispatch);
}

我的问题是,当我调用updateItem操作并在console.log状态时,它总是落后1步。 如果未选中该复选框且该复选框不为true,则仍将状态为true传递给updateItem函数。 我需要调用另一个函数来强制状态更新吗?

trans by 2020-01-18T11:42:55Z

性能-Backbone说,React-Redux应用程序真的可以扩展吗? 即使重新选择。 在手机上

在Redux中,对存储的每次更改都会在所有连接的组件上触发notify。 这使开发人员的工作变得非常简单,但是如果您的应用程序具有N个连接的组件,并且N非常大,该怎么办?

商店的每次更改(即使与组件无关)仍会在商店的2702477354374530030050ed路径上运行notify,并进行简单的_.debounce测试。 很快,对吧? 当然,也许一次。 但是N次,每次改变吗? 设计上的这一根本性变化使我质疑Redux的真正可扩展性。

作为进一步的优化,可以使用_.debounce分批处理所有notify调用。即使如此,对每个商店更改进行N ===测试并处理其他逻辑(例如视图逻辑),似乎是一种解决方法。

我正在开发一个拥有数百万用户的健康与健身社交移动网络混合应用程序,并且正在从Backbone过渡到Redux。 在此应用程序中,向用户显示了可滑动界面,该界面使他们可以在类似于Snapchat的不同视图堆栈之间导航,但每个堆栈都具有无限深度。 在最流行的视图类型中,无限滚动器可以高效地处理提要项(如帖子)的加载,渲染,附加和分离。 对于一个敬业的用户来说,滚动浏览成百上千的帖子,然后输入一个用户的供稿,然后输入另一个用户的供稿,等等并不罕见。即使进行了大量的优化,连接的组件也会变得非常庞大。

现在,另一方面,Backbone的设计允许每个视图精确地听取影响它的模型,从而将N减小为常数。

我是否缺少某些东西,还是Redux在大型应用程序方面存在根本缺陷?

trans by 2020-01-14T16:05:32Z

javascript-嵌套的redux减速器

是否可以组合嵌套有以下结构的减速器:

import 'user' from ...
import 'organisation' from ...
import 'auth' from ...
// ...

export default combineReducers({
  auth: {
    combineReducers({
        user,
        organisation,  
    }),
    auth,
  },
  posts,
  pages,
  widgets,
  // .. more state here
});

国家的结构如下:

{
    auth: {
        user: {
            firstName: 'Foo',
            lastName: 'bar',
        }
        organisation: {
            name: 'Foo Bar Co.'
            phone: '1800-123-123',
        },
        token: 123123123,
        cypher: '256',
        someKey: 123,
    }
}

其中...auth减速器具有以下结构:

{
    token: 123123123,
    cypher: '256',
    someKey: 123,   
}

所以也许散布算子很方便吗? ...auth不确定:-(

trans by 2020-01-14T12:01:20Z

reactjs-我正在使用Redux。 我应该在Redux存储中管理受控输入状态还是在组件级别使用setState?

我一直在尝试找出管理我的反应形式的最佳方法。 我尝试使用onChange触发操作并使用表单数据更新我的redux存储。 我还尝试创建本地状态,并在提交表单时触发并操作并更新redux存储。

我应该如何管理我的受控输入状态?

trans by 2020-01-11T12:36:10Z

reactjs-Redux,如果我想访问数据,是否必须在所有容器中导入存储?

也许我没有全神贯注于redux,但是我看到的所有示例并没有在容器之间真正访问过多状态,因此我没有看到store.getState()的大量使用,但是即使您想要 调度,您需要访问商店,对不对?

因此,除了导入从“路径/到/商店/商店”导入商店

在每个我想要getState()或“ dispatch”的文件中,如何访问该状态,因为如果不包含它,则存储是未定义的。

trans by 2020-01-11T05:19:44Z

reactjs-在React Rou中触发Redux操作以响应路由转换

我在最新的应用程序中使用react-router和redux,并且遇到了一些与基于当前url参数和查询要求的状态更改有关的问题。

基本上,我有一个组件,每次URL更改时都需要更新其状态。 像这样通过装饰器通过redux通过props传递状态

 @connect(state => ({
   campaigngroups: state.jobresults.campaigngroups,
   error: state.jobresults.error,
   loading: state.jobresults.loading
 }))

目前,我正在使用componentWillReceiveProps生命周期方法来响应来自react-router的url更改,因为当this.props.params和this.props.query中的url更改时,react-router会将新的props传递给处理程序。 这种方法的主要问题是,我正在此方法中触发操作以更新状态-然后,该状态通过并传递新的props该组件将再次触发相同的生命周期方法-因此基本上创建了一个无穷循环,目前我正在设置一个 状态变量以阻止这种情况的发生。

  componentWillReceiveProps(nextProps) {
    if (this.state.shouldupdate) {
      let { slug } = nextProps.params;
      let { citizenships, discipline, workright, location } = nextProps.query;
      const params = { slug, discipline, workright, location };
      let filters = this._getFilters(params);
      // set the state accroding to the filters in the url
      this._setState(params);
      // trigger the action to refill the stores
      this.actions.loadCampaignGroups(filters);
    }
  }

是否有基于路线转换来触发动作的标准方法,还是可以将商店的状态直接连接到组件的状态,而不是通过prop传递它? 我尝试使用willTransitionTo静态方法,但无法访问this.props.dispatch。

trans by 2020-01-06T06:23:11Z

javascript-使用mapDispatchToProps避免无阴影的夹板错误

我具有以下组件,它们会在FilterButton props上触发mapDispatchToProps ESlint错误。

import { setFilter } from '../actions/filter';


function FilterButton({ setFilter }) {
  return (
    <button onClick={setFilter}>Click</button>
  );
}

export default connect(null, { setFilter })(FilterButton);

如何在同时保留2677291223131131620352的简洁语法和ESlint规则的同时避免警告?

我知道我可以添加注释以禁止显示警告,但是对每个组件执行此操作似乎都是多余且乏味的。

trans by 2019-12-28T07:05:06Z

reactjs-为什么我们不能在React中将布尔值作为props传递,它总是要求在我的cod中传递字符串

即使我已应用propType验证,但在传递hasvacancy prop的布尔值时,编辑器也会引发错误。 这是我所看到的:

错误:   “ SyntaxError:JSX值应为表达式或带引号的JSX文本”

我知道我要为“ hasvacancy”道具传递一个字符串类型的值,但是我需要做些什么,以便可以通过道具传递布尔值或其他数据类型。

import React from 'react';
import { render } from 'react-dom';


class VacancySign extends React.Component{

  render() {
    console.log('------------hasvacancy------', this.props.hasvacancy);
    if(this.props.hasvacancy) {
      return(
        <div>
          <p>Vacancy</p>
        </div>
      );
    } else {
      return(
        <div>
          <p>No-Vacancy</p>
        </div>);
    }

  }
}

VacancySign.propTypes ={
  hasvacancy: React.PropTypes.bool.isRequired
}

render(<VacancySign hasvacancy='false'/> , 
document.getElementById('root'));
trans by 2019-12-27T22:10:10Z

reactjs-道具更改时重新渲染React组件

我正在尝试将表示性组件与容器组件分开。 我有componentDidMountSitesTable。容器负责触发redux操作,以根据当前用户获取适当的站点。

问题是在最初呈现容器组件之后,异步获取了当前用户。 这意味着容器组件不知道它需要重新执行其componentDidMount函数中的代码,该函数将更新数据以发送到SitesTable。我想我需要在其道具之一时重新渲染容器组件 (用户)更改。 如何正确执行此操作?

class SitesTableContainer extends React.Component {
    static get propTypes() {
      return {
        sites: React.PropTypes.object,
        user: React.PropTypes.object,
        isManager: React.PropTypes.boolean
      }
     }

    componentDidMount() {
      if (this.props.isManager) {
        this.props.dispatch(actions.fetchAllSites())
      } else {
        const currentUserId = this.props.user.get('id')
        this.props.dispatch(actions.fetchUsersSites(currentUserId))
      }  
    }

    render() {
      return <SitesTable sites={this.props.sites}/>
    }
}

function mapStateToProps(state) {
  const user = userUtils.getCurrentUser(state)

  return {
    sites: state.get('sites'),
    user,
    isManager: userUtils.isManager(user)
  }
}

export default connect(mapStateToProps)(SitesTableContainer);
trans by 2019-12-23T20:34:49Z

reactjs-如何向Redux添加多个中间件?

我已经插入了一个中间件redux-thunk,我想添加另一个redux-logger。

如何配置它,以便我的应用程序同时使用两种中间件? 我尝试传递[ReduxThunk, logger]的数组,但这没有用。

码:

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk';
import logger from 'redux-logger';

import App from './components/app';
import reducers from './reducers';
require('./style.scss');

const createStoreWithMiddleware = applyMiddleware(ReduxThunk)(createStore);

ReactDOM.render(
  <Provider store={createStoreWithMiddleware(reducers)}>
    <App />
  </Provider>,
  document.querySelector('#app')
);
trans by 2019-11-15T11:30:46Z

javascript-尽管为createStore()提供了初始状态,为什么仍会收到“初始化期间未定义的归还器[...]”?

我已经在redux createStore方法中设置了InitialState,并将对应的InitialState作为第二个参数

我在浏览器中遇到错误:

<code>Uncaught Error: Reducer "postsBySubreddit" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined.</code>

代码在这里:

import { createStore, applyMiddleware } from 'redux'
import thunkMiddleware from 'redux-thunk'
import createLogger from 'redux-logger'
import rootReducer from '../reducers/reducers'
import Immutable from 'immutable'
const loggerMiddleware = createLogger()
//const initialState=0
function configureStore() {
    return createStore(
    rootReducer,
     {postsBySubreddit:{},selectedSubreddit:'reactjs'},
     applyMiddleware(
     thunkMiddleware,
    loggerMiddleware
  )
 )
}
  export default configureStore

我在Root.js中调用了configeStore方法:

 import React, { Component } from 'react'
 import { Provider } from 'react-redux'
 import configureStore from '../store/configureStore'
 import AsyncApp from './AsyncApp'
 import Immutable from 'immutable'
 const store = configureStore()
 console.log(store.getState())
 export default class Root extends Component {
 render() {
   return (
     <Provider store={store}>
       <AsyncApp />
     </Provider>
  )
 }
}

但我猜这initialState有问题:

import { combineReducers } from 'redux'
import {reducerCreator} from '../utils/creator'
import Immutable from'immutable'
import {SELECT_SUBREDDIT, INVALIDATE_SUBREDDIT ,REQUEST_POSTS, RECEIVE_POSTS} from '../actions/action'
let initialState=Immutable.fromJS({isFetching: false, didInvalidate: false,items:[]})

function selectedSubreddit(state, action) {
  switch (action.type) {
  case SELECT_SUBREDDIT:
    return action.subreddit
  default:
    return state
  }
}
function postsBySubreddit(state, action) {
  switch (action.type) {
    case INVALIDATE_SUBREDDIT:
    case RECEIVE_POSTS:
    case REQUEST_POSTS:
      return Object.assign({}, state, {
        [action.subreddit]: posts(state[action.subreddit], action)
      })
    default:
      return state
  }
}
function posts(state=initialState,action) {
  switch (action.type) {
    case INVALIDATE_SUBREDDIT:
      return state.merge({
        didInvalidate: true
      })
    case REQUEST_POSTS:
      return state.merge({
        isFetching: true,
        didInvalidate: false
      })
    case RECEIVE_POSTS:
      return state.merge({
        isFetching: false,
        didInvalidate: false,
        items: action.posts,
        lastUpdated: action.receivedAt
      })
    default:
      return state 
    }
}

const rootReducer = combineReducers({
  postsBySubreddit,
 selectedSubreddit
})
export default rootReducer

但是,如果我在每个子减速器中都设置了initialState,则它可以正常显示文字。 有问题?

trans by 2019-11-14T05:08:00Z

reactjs-如何在刷新时持久化redux状态树?

Redux文档的第一个原理是:

整个应用程序的状态存储在单个存储中的对象树中。

而且我实际上以为我对所有原则都很了解。但是我现在对应用程序的含义感到困惑。

我理解,如果应用程序仅意味着网站中复杂的小部分之一并且仅用一页即可工作。 但是,如果申请意味着整个网站怎么办? 我应该使用LocalStorage还是cookie或其他保留状态树的东西? 但是如果浏览器不支持LocalStorage怎么办?

我想知道开发人员如何保留其状态树! :)

trans by 2019-11-10T22:50:58Z

reactjs-打字稿+ React / Redux:'IntrinsicAttributes和IntrinsicClassAttributes类型不存在属性“ XXX”

我正在使用Typescript,React和Redux(都在Electron中运行)进行项目,当我将一个基于类的组件包含在另一个组件中并试图在它们之间传递参数时,我遇到了一个问题。 松散地说,容器组件具有以下结构:

class ContainerComponent extends React.Component<any,any> {
  ..
  render() {
    const { propToPass } = this.props;
    ...
    <ChildComponent propToPass={propToPass} />
    ...
  }
}

....
export default connect(mapStateToProps, mapDispatchToProps)(ContainerComponent);

和子组件:

interface IChildComponentProps extends React.Props<any> {
  propToPass: any
}

class ChildComponent extends React.Component<IChildComponentProps, any> {
  ...
}

....
export default connect(mapStateToProps, mapDispatchToProps)(ChildComponent);

显然,我只包括基础知识,这两个类还有很多其他内容,但是当我尝试运行对我来说看起来像是有效代码的代码时,仍然出现错误。 我得到的确切错误:

TS2339: Property 'propToPass' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<{}, ComponentState>> & Readonly<{ childr...'.

当我第一次遇到错误时,我以为是因为我没有传入定义道具的接口,但是我创建了该错误(如您在上面看到的),但它仍然无法正常工作。 我想知道,我缺少什么吗?

当我从ContainerComponent中的代码中排除ChildComponent属性时,它呈现的很好(除了我的ChildComponent没有关键属性),但在JSX Typescript中使用它拒绝编译它。 我认为这可能与基于本文的连接包装有关,但是该文章中的问题出现在index.tsx文件中,并且是提供程序的问题,我在其他地方也遇到了问题。

trans by 2019-11-06T14:56:31Z

javascript-在异步redux操作成功后过渡到另一条路由

我有一组非常简单的react组件:

  • .then()挂接到redux并处理操作,存储订阅等
  • .then()显示我的项目列表
  • .then()是一种将新项目添加到列表的表单

我有一些反应路由器路由,如下所示:

<Route name='products' path='products' handler={ProductsContainer}>
  <Route name='productNew' path='new' handler={ProductNew} />
  <DefaultRoute handler={ProductsList} />
</Route>

因此显示的是.then()dispatch,但未同时显示。

我想做的是,一旦成功添加了新项目,就使应用程序重新路由回列表。

到目前为止,我的解决方案是在异步dispatch之后使用.then()

dispatch(actions.addProduct(product)
  .then(this.transitionTo('products'))
)

这是执行此操作的正确方法,还是我应该以其他方式触发其他操作以触发路线更改?

trans by 2019-11-05T21:30:18Z

javascript-如何为具有列表/详细视图和分页的应用选择Redux状态形状?

假设我的数据库中有许多条目(例如,用户)。 我也有两条路线,一条用于列表,另一条用于详细信息(您可以在其中编辑条目)。 现在,我在努力处理数据结构。

我正在考虑两种方法以及两者的某种组合。

共享数据集

  • 我导航到users_currently_visible,我的所有用户都是从存储在redux存储中的api下载的,在键/list下,我还添加了<id>users_currently_visible来仅呈现列表的一部分
  • 然后,我导航到users_currently_visible,并将/list<id>都存储为val ...,这意味着我将可以使用users_currently_visible这样的方式获取用户数据。
  • 更新也将非常容易,因为我只使用一个数据集并指向它的详细信息
  • 添加新用户也很容易,再次使用相同的用户列表

现在,这种方法的问题在于,当用户列表变得庞大(例如数百万)时,下载可能需要一段时间。 而且,当我直接导航至users_currently_visible时,我还没有下载所有用户,因此,要仅获取我需要的用户的数据,我必须先下载整个内容。 数百万的用户只需要编辑一个。

分离的数据集

  • 我导航至users_currently_visible,而不是从api下载我的所有用户,而是根据我的/list<id>的设置,仅下载了其中的几个用户,我可能会将数据存储为users_currently_visible
  • 然后,我导航到users_currently_visible,将/list存储为<id>,并将其作为val ...,而不是搜索users_currently_visible,我只是从api下载用户数据。
  • 更新时,我不会以任何方式更新users_currently_visible
  • 我也不会添加

我在这里看到的可能的问题是,在访问users_currently_visible时,我将不得不再次从api下载数据,因为它可能与数据库中的内容不同步,我也可能不必要地详细下载用户数据, 因为它们可能已经在我的/list

某种科学怪人的恶作剧

  • 我会详细说明,我的做法与“分离数据集”中的相同,但我首先检查了以下几点:不是直接从api下载用户数据
    • 我有users_currently_visible
    • 如果是这样,他们之间是否有一个我的ID用户?如果都正确,则将其用作用户数据,否则将进行api调用
  • 更新时也会发生同样的情况,我检查我的用户是否在users_currently_visible之间,如果存在,我也会更新该列表,如果不存在,我什么也不做

这可能会起作用,但实际上并不觉得这是正确的方法。 在访问/list时,我可能仍然仍需要下载users_currently_visible的新列表,因为我可能添加了一个新列表。

有什么球迷喜欢的方式做到这一点吗?...我确定每个redux用户都必须遇到相同的事情。

谢谢!

trans by 2019-10-23T19:03:11Z

javascript-使用传播语法在ES6中进行深层复制

我正在尝试为我的Redux项目创建一个深层复制映射方法,该方法将处理对象而不是数组。 我了解到,在Redux中,每个状态都不应更改以前的状态。

export const mapCopy = (object, callback) => {
    return Object.keys(object).reduce(function (output, key) {

    output[key] = callback.call(this, {...object[key]});

    return output;
    }, {});
}

有用:

    return mapCopy(state, e => {

            if (e.id === action.id) {
                 e.title = 'new item';
            }

            return e;
        })

但是,它不会深度复制内部项目,因此我需要将其调整为:

export const mapCopy = (object, callback) => {
    return Object.keys(object).reduce(function (output, key) {

    let newObject = {...object[key]};
    newObject.style = {...newObject.style};
    newObject.data = {...newObject.data};

    output[key] = callback.call(this, newObject);

    return output;
    }, {});
}

这不太优雅,因为它需要知道传递了哪些对象。ES6中是否有一种方法可以使用传播语法来深度复制对象?

trans by 2019-10-15T07:46:52Z

Javascript-Redux中常量的意义是什么?

例如从此示例:

export const ADD_TODO = 'ADD_TODO'
export const DELETE_TODO = 'DELETE_TODO'
export const EDIT_TODO = 'EDIT_TODO'
export const COMPLETE_TODO = 'COMPLETE_TODO'
export const COMPLETE_ALL = 'COMPLETE_ALL'
export const CLEAR_COMPLETED = 'CLEAR_COMPLETED'

这不像您要保存字符。 变量名称与字符串完全相同,并且永远不会更改。 如果您有一天要做类似的事情,我会理解使常量:

ADD_TODO = 'CREATE_TODO'

但这永远不会发生。 那么这些常数有什么作用?

trans by 2019-10-13T23:51:13Z

反应路由器-如何同步Redux状态和url查询参数

我有一个带有搜索面板的网页。 搜索面板有几个输入字段:id,size,...

我想要的是用户设置搜索值(例如:id = 123和size = 45)并按下搜索按钮时:

  1. Redux reducer中的searchState应该使用新的搜索值(id = 123和size = 45)进行更新
  2. 网址应更改为“ [http:// mydomain / home?id = 123&size = 45“]

另一方面,如果用户将URL更改为[http:// mydomain / home?id = 111&size = 22],则:

  1. reducer中的searchState应该使用新的搜索值(id = 111和size = 22)进行更改
  2. UI搜索面板输入应更新为新值(id = 111和size = 22)

如何达成目标? 我应该使用什么路由器(react-router,redux-router,react-router-redux或其他)?

trans by 2019-10-11T01:11:03Z

reactjs-跟踪为什么重新渲染React组件

是否有系统的方法来调试导致组件在React中重新渲染的原因? 我放置了一个简单的console.log()来查看它渲染了多少次,但是在弄清楚是什么导致组件多次渲染(即我的情况是4次)时遇到了麻烦。 是否存在可以显示时间轴和/或所有组件树渲染和顺序的工具?

trans by 2019-10-04T10:19:18Z

reactjs-什么时候在react / redux中使用bindActionCreators?

用于bindActionCreators的Redux文档指出:

bindActionCreators的唯一用例是当您要将一些操作创建者传递给一个不了解Redux的组件,并且您不想将调度或Redux存储传递给该组件。

举一个使用/需要bindActionCreators的示例为例?

哪种组件不知道Redux?

两种选择的优点/缺点是什么?

//actionCreator
import * as actionCreators from './actionCreators'

function mapStateToProps(state) {
  return {
    posts: state.posts,
    comments: state.comments
  }
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(actionCreators, dispatch)
}

VS

function mapStateToProps(state) {
  return {
    posts: state.posts,
    comments: state.comments
  }
}

function mapDispatchToProps(dispatch) {
  return {
    someCallback: (postId, index) => {
      dispatch({
        type: 'REMOVE_COMMENT',
        postId,
        index
      })
    }
  }
}
trans by 2019-09-28T10:12:25Z

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