javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

reactjs-来自的Redux-Form初始值

我正在尝试用来自API的数据填写个人资料表单。 不幸的是,在这种情况下,redux-form不想与我合作。 由于某些原因,无论我做什么,字段都保持为空。

出于某些原因,设置固定值而不是从reducer传递的值效果很好。

也许是因为我在动作创建者内部对API调用使用了redux-promise? 我如何忍受它并摆脱它。 这是我的表单组件。

import React, { Component } from 'react';
import { reduxForm, Field } from 'redux-form';
import { connect } from 'react-redux';
import { fetchRoleList, fetchUserData } from '../actions';

class UserEdit extends Component {

    componentWillMount() {
        this.props.fetchRoleList();
        this.props.fetchUserData();
    }

    handleEditProfileFormSubmit(formProps) {
        console.log(formProps);
    }

    getRoleOptions(selected_id) {
        if (!this.props.profile) {
            return <option>No data</option>;
        }

        return this.props.profile.roles.map(role => {
            return <option key={role.role_id} value={role.role_id}>{role.name}</option>;
        });
    }

    renderField(props) {
        const { input, placeholder, label, value, type, meta: { touched, error } } = props;
        return (
        <fieldset className={`form-group ${ (touched && error) ? 'has-error' : '' }`}>
            <label>{label}</label>
            <input className="form-control" {...input} type={type} placeholder={placeholder} />
            {touched && error && <div className="error">{error}</div>}
        </fieldset>
        );
    }

    renderSelect({ input, placeholder, options, label, type, meta: { touched, error } }) {
        return (
        <fieldset className={`form-group ${ (touched && error) ? 'has-error' : '' }`}>
            <label>{label}</label>
            <select className="form-control" {...input}>
                {options}
            </select>
            {touched && error && <div className="error">{error}</div>}
        </fieldset>
        );
    }

    render() {
        const { handleSubmit } = this.props;

        const user = this.props.profile.user;

        return (
        <div> {user ? user.email : ''}
            <form onSubmit={handleSubmit(this.handleEditProfileFormSubmit.bind(this))}>
                <Field name="email" label="Email:" component={this.renderField} type="text" placeholder="email@gmail.com" className="form-control"/>
                <Field name="name" label="Name:"  component={this.renderField} type="text" placeholder="John Doe" className="form-control"/>
                <Field name="role" label="Role:" component={this.renderSelect} type="select" className="form-control" options={this.getRoleOptions()}/>
                <button action="submit" className="btn btn-primary">Edit user</button>

                <Field name="password" label="Password:" component={this.renderField} type="password" className="form-control"/>
                <Field name="passwordConfirm" label="Confirm Password:" component={this.renderField} type="password" className="form-control"/>
                { this.props.errorMessage
                &&  <div className="alert alert-danger">
                        <strong>Oops!</strong> {this.props.errorMessage}
                    </div> }
                <button action="submit" className="btn btn-primary">Sign up!</button>
            </form>
        </div>
        );
    }

}

let InitializeFromStateForm = reduxForm({
    form: 'initializeFromState'
})(UserEdit);

InitializeFromStateForm = connect(
  state => ({
    profile: state.profile,
    initialValues: state.profile.user
  }),
  { fetchRoleList, fetchUserData }
)(InitializeFromStateForm);

export default InitializeFromStateForm;

我相信动作创建者也将很有用:

export function fetchUserData(user_id) {
    user_id = user_id ? user_id : '';

    const authorization = localStorage.getItem('token');
    const request = axios.get(`${ROOT_URL}/user/${user_id}`, {
      headers: { authorization }
    });

    return {
        type: FETCH_USER,
        payload: request
    };
}
trans by 2020-08-11T10:17:41Z

javascript-如何在React + Redux中优化对嵌套组件的prop的小更新?

示例代码:[https://github.com/d6u/example-redux-update-nested-props/blob/master/one-connect/index.js]

观看现场演示:[http://d6u.github.io/example-redux-update-nested-props/one-connect.html]

如何优化嵌套组件的prop的小更新?

我有上述组件,Repo和RepoList。 我想更新第一个仓库的标签(第14行)。 所以我派出了UPDATE_TAG动作。 在我实施connect之前,调度大约需要200毫秒,这是可以预期的,因为我们浪费了很多时间来更改mapStateToPropss,而这没有改变。

添加connect后,调度大约需要30毫秒。 在生产构建React.js之后,更新仅花费约17ms。 这样会好很多,但是Chrome开发者控制台中的时间轴视图仍指示帧框架(大于16.6毫秒)。

enter image description here

想象一下,如果我们有许多这样的更新,或者connect比当前更新更复杂,我们将无法维持60fps。

我的问题是,对于嵌套组件的props这样小的更新,是否有更有效和规范的方法来更新内容? 我还能使用Redux吗?

通过将每个connect替换为可观察的内部减速器,我得到了一个解决方案。 就像是

// inside reducer when handling UPDATE_TAG action
// repos[0].tags of state is already replaced with a Rx.BehaviorSubject
get('repos[0].tags', state).onNext([{
  id: 213,
  text: 'Node.js'
}]);

然后,我使用[https://github.com/jayphelps/react-observable-subscribe]在Repo组件内订阅了它们的值。 即使使用React.js进行开发,每次调度也仅花费5毫秒。 但是我觉得这是Redux中的反模式。

更新1

我按照Dan Abramov的回答中的建议进行了规范化,并更新了连接组件

新的状态形状为:

{
    repoIds: ['1', '2', '3', ...],
    reposById: {
        '1': {...},
        '2': {...}
    }
}

我在mapStateToProps周围添加了connect,以设置初始渲染的时间。

但是,性能比以前差(初始渲染和更新)。 (来源:[https://github.com/d6u/example-redux-update-nested-props/blob/master/repo-connect/index.js,]实时演示:[http://d6u.github.io /example-redux-update-nested-props/repo-connect.html)]

// With dev build
INITIAL: 520.208ms
DISPATCH: 40.782ms

// With prod build
INITIAL: 138.872ms
DISPATCH: 23.054ms

enter image description here

我认为每个connect上的connect都有很多开销。

更新2

根据Dan更新后的答案,我们必须返回connectmapStateToProps参数来返回函数。 您可以查看Dan的答案。 我还更新了演示。

下面,我的计算机上的性能要好得多。 只是为了好玩,我还在我所说的减速器方法中添加了副作用(来源,演示)(严重的是不使用它,仅用于实验)。

// in prod build (not average, very small sample)

// one connect at root
INITIAL: 83.789ms
DISPATCH: 17.332ms

// connect at every <Repo/>
INITIAL: 126.557ms
DISPATCH: 22.573ms

// connect at every <Repo/> with memorization
INITIAL: 125.115ms
DISPATCH: 9.784ms

// observables + side effect in reducers (don't use!)
INITIAL: 163.923ms
DISPATCH: 4.383ms

更新3

刚刚添加了基于“记忆中的联系”的虚拟化示例

INITIAL: 31.878ms
DISPATCH: 4.549ms
trans by 2020-08-06T19:14:40Z

reactjs-如何在React Link组件上使用onClick事件?

我正在使用reactjs路由器中的Link组件,但无法使onClickevent运行。 这是代码:

<Link to={this.props.myroute} onClick='hello()'>Here</Link>

这是做这件事的方式还是另一种方式?

trans by 2020-06-21T00:33:50Z

javascript-我在哪里可以从React Redux应用程序的服务器中获取初始数据?

我已经开始学习React / Redux,偶然发现了可能是一个非常基本的问题。 以下是我的应用程序中的代码段,为简单起见删除了一些代码。

我的状态由一系列网站描述,默认情况下为空。 当用户分页到其他页面时,以后的reducer将具有LOAD_SITES的操作来加载不同的站点集,但现在它什么也不做。 React首先渲染PublishedSitesBox,然后渲染componentDidMount,然后循环遍历数据并渲染各个站点。

我想做的是让它使用默认的空数组呈现所有内容,同时启动“从服务器加载站点”承诺,一旦解决,就调度LOAD_SITES操作。 拨打电话的最佳方法是什么? 我在考虑PublishedSitesBox的构造函数或componentDidMount的构造函数。但是不确定这是否可行-我担心的是,我将以这种方式创建一个无限循环,以保持重新渲染。 我想我可以通过沿“ haveRequestedInitialData”行设置一些其他状态参数来防止这种无限循环。 我的另一个想法是在完成2926885254453553527555之后立即做出这个承诺。什么是最好,最干净的方法?

export default function sites(state = [], action) {
  switch (action.type) {
    default:
      return state;
  }
}
...

const publishedSitesPageReducer = combineReducers({
  sites
});

ReactDOM.render(
  <Provider store={createStore(publishedSitesPageReducer)}>
    <PublishedSitesPage />
  </Provider>,
  this.$view.find('.js-published-sites-result-target')[0]
);

...

export default function PublishedSitesPage() {
  return (
    <PublishedSitesBox/>
  );
}

...

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

const PublishedSitesBox = connect(mapStateToProps)(({sites}) => {
  // render sites
});
trans by 2020-06-17T11:34:31Z

javascript-redux,react-redux,redux-thunk有什么区别?

我正在使用React + Flux。 我们的团队计划从助焊剂转变为还原剂。 Redux对来自助焊剂世界的我非常困惑。 在磁通控制中,从组件->操作->存储和存储更新返回组件很简单。 它简单而非常清楚。

但是在redux中令人困惑。 这里没有商店,是的,有些例子没有使用商店。 我经历了一些教程,似乎每个人都有自己的实现风格。 有些正在使用容器,有些则没有。 (我不知道这个Containers概念,也无法理解mapStateToProps,mapDispatchToProps的作用)。

  1. 有人可以清楚地说明redux中的控制流如何发生吗?
  2. redux中的组件/容器/动作/动作创建者/商店的作用是什么?
  3. redux / react-redux / redux-thunk /其他之间的区别??
  4. 如果您可以发布任何简单而精确的redux教程的链接,这将非常有帮助。
trans by 2020-02-11T04:33:49Z

reactjs-如何在jes中测试axios

我有这个反应

export function fetchPosts() {
    const request = axios.get(`${WORDPRESS_URL}`);
    return {
        type: FETCH_POSTS,
        payload: request
    }
}

在这种情况下,如何测试axios? 开玩笑说,在那个网站上有一个异步代码的用例,他们使用了一个模拟函数,但是我不知道我是否可以用axios做到这一点? 参考:[https://facebook.github.io/jest/docs/tutorial-async.html]

到目前为止,我已经测试了它是否返回了正确的类型

it('should dispatch actions with the correct type', () => {
    store.dispatch(fetchPosts());
    let action = store.getActions();
    expect(action[0].type).toBe(FETCH_POSTS);
});

我不知道如何传递模拟数据并测试它是否返回,但是有人有任何想法吗?

先感谢您

trans by 2020-02-09T04:08:21Z

了解Redux中的撰写功能

我试图在redux中创建一个商店,目前正在使用以下语法:-

const middlewares = [
  thunk,
  logger
]

const wlStore = createStore(
  rootReducer,
  initialState
  compose(applyMiddleware(...middlewares))
)

上面的代码对我来说很好用,我可以访问商店,但是最近我碰到了另一种语法:

const wlStore=applyMiddleware(thunk,logger)(createStore)(rootReducer)

他们俩似乎都在做同样的工作。

有什么理由要使我优先? 优点缺点?

trans by 2020-01-25T10:28:18Z

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组件

我正在尝试将表示性组件与容器组件分开。 我有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

反应路由器-如何同步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-找不到模块:'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 / 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

javascript-Redux中的mapToDispatchToProps()的参数时,“ dispatch”不是函数

我是一位javascript / redux / react初学者,使用redux,react-redux和react构建一个小型应用程序。 出于某种原因,当在连接(反应-redux绑定)的同时使用mapDispatchToProps函数时,我收到一个TypeError,指示当我尝试执行生成的prop时,dispatch不是函数。 但是,当我将dispatch称为prop时(请参阅提供的代码中的setAddr函数),它可以工作。

我很好奇这是为什么,在redux docs的示例TODO应用程序中,mapDispatchToProps方法是以相同的方式设置的。 当我在函数内部进行console.log(dispatch)时,它说dispatch是类型对象。 我可以继续以这种方式使用调度,但是在继续使用redux之前,我会更好地知道为什么会这样。 我正在将webpack与babel-loaders一起使用进行编译。

我的代码:

import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';
import { setAddresses } from '../actions.js';
import GeoCode from './geoCode.js';
import FlatButton from 'material-ui/lib/flat-button';

const Start = React.createClass({
    propTypes: {
        onSubmit: PropTypes.func.isRequired
    },

    setAddr: function(){
        this.props.dispatch(
            setAddresses({
                pickup: this.refs.pickup.state.address,
                dropoff: this.refs.dropoff.state.address
            })
        )   

    },

    render: function() {
        return (
            <div>
                <div className="row">
                    <div className="col-xs-6">
                        <GeoCode ref='pickup' />
                    </div>
                    <div className="col-xs-6">
                        <GeoCode ref='dropoff' />
                    </div>
                </div>
                <div className="row">
                    <div className="col-xs-6">
                        <FlatButton 
                            label='Does Not Work'
                            onClick={this.props.onSubmit({
                                pickup: this.refs.pickup.state.address,
                                dropoff: this.refs.dropoff.state.address
                            })} 
                            />
                    </div>
                    <div className="col-xs-6">
                        <FlatButton 
                            label='Works'
                            onClick={this.setAddr} 
                            />
                    </div>
                </div>
            </div>
        );
    }
})

const mapDispatchToProps = (dispatch) => {
    return {
        onSubmit: (data) => {
            dispatch(setAddresses(data))
        }
    }
}

const StartContainer = connect(mapDispatchToProps)(Start)

export default StartContainer

干杯。

trans by 2019-09-18T22:53:40Z

如何在React native redux的reducer中向数组添加元素?

如何在reducer中的redux状态的数组arr []中添加元素?我这样做 -

import {ADD_ITEM} from '../Actions/UserActions'
const initialUserState = {
    arr:[]
}

export default function userState(state = initialUserState, action)
{
    console.log(arr);
    switch (action.type)
    {
        case ADD_ITEM: 
            return { 
                      ...state,
                      arr: state.arr.push([action.newItem])
                   }

        default:
            return state
    }
}
trans by 2019-05-11T19:35:41Z

javascript - 如何在Redux中显示执行异步操作的模式对话框?

我正在构建一个需要在某些情况下显示确认对话框的应用程序。

假设我想删除一些东西,然后我会发送一个像deleteSomething(id)这样的动作,这样一些reducer会捕获该事件并填充对话框缩减器以显示它。

当这个对话提交时,我怀疑了。

  • 该组件如何根据调度的第一个操作调度正确的操作?
  • 动作创建者应该处理这个逻辑吗?
  • 我们可以在减速机内添加动作吗?

编辑:

使它更清楚:

deleteThingA(id) => show dialog with Questions => deleteThingARemotely(id)

createThingB(id) => Show dialog with Questions => createThingBRemotely(id)

所以我正在尝试重用对话框组件。 显示/隐藏对话框不是问题,因为这可以在reducer中轻松完成。 我想要指定的是如何根据左侧开始流动的动作从右侧调度动作。

trans by 2019-03-10T15:35:16Z

1 共1页