2017-04-25 41 views
0

我已經設法使用axios請求獲取用戶信息。我也設法使用我創建的組件來呈現用戶信息。我的問題是,我不能將它顯示在另一個我創建的稱爲ProfileForm的組件上。 ProfileForm用作更新用戶信息的表單。我想用用戶信息設置約束器的狀態。如何使用用戶信息渲染表單(React + Redux)

而且,當我改變值this.props.user.username等。我接收兩個錯誤:

警告:無法丙類型:該道具valueTextFieldGroup需要被標記,但它的值是undefined。 在TextFieldGroup(在ProfileForm.js:112) 在ProfileForm(在ProfilePage.js:23)

,第二個是

warning.js:36警告:TextFieldGroup正在改變不受控制 輸入要控制的文本類型。輸入元素不應將 從非受控狀態切換到受控狀態(反之亦然)。決定在 組件的使用期限內使用受控或非受控輸入元素 。

class ProfileForm extends React.Component 
    constructor(props) { 
     super(props); 
     this.state = { 
     username: '', 
     email: '', 
     password: '', 
     passwordConfirmation: '', 
     errors: {}, 
     isLoading: false, 
     invalid: false 
     }; 

     this.handleChange = this.handleChange.bind(this); 
     this.handleSubmit = this.handleSubmit.bind(this); 
    } 

    handleChange(event) { 
     this.setState({ [event.target.name]: event.target.value }); 
    } 

    render() { 
     const { errors } = this.state; 
     return (
     <form onSubmit={this.handleSubmit}> 

      <TextFieldGroup 
      error={errors.username} 
      placeholder="Username" 
      onChange={this.handleChange} 
      value={user.username} <-- Here should be the bind 
      field="username" 
      /> 
      <TextFieldGroup 
      error={errors.email} 
      placeholder="Email" 
      onChange={this.handleChange} 
      checkUserExists={this.checkUserExists} 
      value={user.email} <-- Here should be the bind 
      field="email" 
      /> 
      <TextFieldGroup 
      error={errors.password} 
      placeholder="Password" 
      onChange={this.handleChange} 
      value={user.password} <-- Here should be the bind 
      field="password" 
      /> 
      <div className="form-group"> 
       <button disabled={this.state.isLoading || this.state.invalid} className="btn btn-primary btn-md btn-block">Update</button> 
      </div> 
     </form> 
    ); 
    } 
} 

export default ProfileForm; 

這裏是我的ProfilePage

class ProfilePage extends React.Component { 
     componentDidMount() { 
      this.props.getUser(); 
     } 

     render() { 
      const { profileUpdateRequest, addFlashMessage, getUser, isUserExists } = this.props; 
      return (
      <div className="row"> 
        <div className="row text-center"> 
        <UserProfile user={this.props.user} /> <-- This works!!!! 
        </div> 
        <ProfileForm 
         profileUpdateRequest={profileUpdateRequest} 
         addFlashMessage={addFlashMessage} 
         getUser={getUser} 
         user={this.props.user} <--- This doesnt work!!!! 
         isUserExists={isUserExists} 
        />      
      </div> 
     ); 
     } 
    } 

和我的用戶配置其工作

export default function UserProfile({ user }) { 

    const userProfile = (
    <div className="row"> 
     {user.username} {user.email} 
    </div> 
); 

    return (
    <div> 
     {userProfile} 
    </div> 
); 
} 

我ProfileUpdateAction行動

export function getUser() { 
    return dispatch => { 
    return axios.get('/api/user') 
    .then(res => res.data) 
    .then(data => dispatch(setUser(data.user))); 
    } 
} 

我的減速器

import { SET_USER } from '../actions/profileUpdateActions'; 

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

我textFieldGroup

const TextFieldGroup = ({ field, value, label, error, type, onChange, placeholder, min, checkUserExists, disabled }) => { 
     return (
     <div className={classnames("form-group", {'has-error': error})}> 
       <label className="control-label">{label}</label> 
       <input 
       type={type} 
       name={field} 
       className="form-control" 
       value={value} 
       min={min} 
       onChange={onChange} 
       onBlur={checkUserExists} 
       placeholder={placeholder} 
       disabled={disabled} 
       /> 
       {error && <span className="help-block">{error}</span>} 
     </div> 
    ); 
    } 

    TextFieldGroup.propTypes = { 
     field: React.PropTypes.string.isRequired, 
     value: React.PropTypes.string.isRequired, 
     label: React.PropTypes.string, 
     error: React.PropTypes.string, 
     min: React.PropTypes.string, 
     disabled: React.PropTypes.bool, 
     placeholder: React.PropTypes.string.isRequired, 
     type: React.PropTypes.string.isRequired, 
     onChange: React.PropTypes.func.isRequired, 
     checkUserExists: React.PropTypes.func 
    } 
    TextFieldGroup.defaultProps = { 
     type: 'text' 
    } 
    export default TextFieldGroup; 
+0

您在標題中發佈了(React + redux)。您能否請您發佈適用於這種情況的減速器和操作。 即:我認爲'this.props.getUser()'是一個動作。 –

+2

用戶不會在您的道具對象(this.props.user.username)上嗎? –

+0

這真是非常感謝! –

回答

1

在用戶配置,您使用的是道具作爲參數傳遞一個無狀態的組件。在函數params中,您將用戶解構爲自己的常量。這很酷,運作良好。

但是,在UserForm中,您有一個基於類的組件。道具對象被附加到對象的上下文(this)。所以要訪問它,你需要使用this.props.user

+0

Yeap,絕對有效!非常感謝!但是這樣做會引發兩個錯誤。第一個說道,'value'在'TextFieldGroup'中被標記爲必需的,但它的值是'undefined'。第二個說TextFieldGroup正在改變一個不受控制的輸入類型文本。輸入元素不應從非受控狀態切換到受控狀態(反之亦然)等。我將更新我的問題 –

+0

發生值錯誤的原因是組件第一次安裝時沒有道具。因此,TextFieldGroup會短暫接收未定義的值,直到道具傳入爲止。爲了解決這個問題,您可以將其設置爲可選值,或者可以將用戶移動到您的狀態並初始化狀態以使用戶對象具有空白值。第二個錯誤的發生可能是因爲用戶字段沒有被綁定,因爲它是未定義的。我相信修復第一個問題也將解決第二個問題。讓我知道如果它不=)。 –