【问题标题】:Javascript property is shows undefined when used as default state in ReactJavascript 属性在 React 中用作默认状态时显示未定义
【发布时间】:2020-09-14 11:00:14
【问题描述】:

我通过useEffect 获取了一些内容,用作我的应用程序的默认状态。请看下面的代码:

const id = props.match.params.id;
const classes = UseStyles();
const dispatch = useDispatch();

useEffect(() => dispatch(fetchCategories()), []);
const categories = useSelector((state) => state).generalReducer.category;

useEffect(() => dispatch(fetchBusinessDetail(id)), []);
const business = useSelector((state) => state).generalReducer.businessDetail;
console.log(business);

console.log(business.name);
let defaultState = {
  name: business.name,
  description: business.description,
  url: business.url,
  phone: business.phone,
  address: business.address,
  category_id: [],
  email: business.email,
  image: "",
};

const [formState, setFormState] = useState(defaultState);
console.log(formState);

console.log(business)console.log(business.name) 给出了预期的结果,但是,console.log(formState) 给出了如下未定义的值:

{
  // ...
  image: "";
  name: undefined;
  phone: undefined;
  url: undefined;
}

请问我该如何解决这个问题?

【问题讨论】:

    标签: javascript reactjs redux react-redux react-hooks


    【解决方案1】:

    使用useState(initialState)initialState 将是初始渲染上的值。

    在初始渲染期间,返回的状态(state)与作为第一个参数(initialState)传递的值相同。

    因为你获取defaultState,它的初始值是你从redux store得到的:

    // business values are values from redux store
    let defaultState = {name: business.name, description: business.description, url:business.url, phone:business.phone, address: business.address, category_id: [], email:business.email, image:''  };
    

    通常,您在完成获取后更新状态

    const businessSelector = state => state.generalReducer.businessDetail;
    
    const business = useSelector(businessSelector);
    
    // Fetch and update `business` above.
    useEffect(() => dispatch(fetchBusinessDetail(id)), []);
    
    // `business` get new values and update the form.
    useEffect(() => {
      setFormState(business);
    }, [business]);
    

    【讨论】:

    • 是的,获取数据后,他必须使用setFormState设置它,你是对的,你能解释一下useSelector((state) => state).generalReducer.businessDetail;这个代码是做什么的吗?
    • OP 问题的错字,应该是选择器
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多