程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了redux store 改变时如何更新功能组件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决redux store 改变时如何更新功能组件?

开发过程中遇到redux store 改变时如何更新功能组件的问题如何解决?下面主要结合日常开发的经验,给出你关于redux store 改变时如何更新功能组件的解决方法建议,希望对你解决redux store 改变时如何更新功能组件有所启发或帮助;

我正在尝试使用 MaterialUI 制作表格,数据来自 Psql 数据库。我有一个自定义钩子来调度动作,并使用 useSELEctor 填充我的组件。但是,我在组件中有一个表单,当提交时,表中的数据没有更新,因此应用程序崩溃,因为 arr.map 函数失败。如何在不重新加载页面的情况下在提交表单时更新商店。目前我能做到这一点的唯一方法是允许表单提交的默认设置。@H_301_1@

我的减速器@H_301_1@

    switch (action.typE) {
        case LOGIN_USER:
        case FETCH_USER:
        case REGISTER_USER:
            return action.payload;

        case GET_user_iNFO:
        case updatE_USER:
            return { ...state,...action.payload };

        case FETCH_all_USERS:
            return {...state,users: action.payloaD};

        case logoUT_USER:
            return INITIAL_STATE;

        default:
            return state;
    }
}

export default userReducer;

我的操作@H_301_1@

  return async function(dispatch) {
    try {
      const user = await kfshAPI.register(data);
      // localstorage.setItem('user-token',user.token);
      await dispatch(userRegistered(user));
      await dispatch(
        adDalert(
          `Registration successful! ${data.firstnamE}'s account has been created!`,'success'
        )
      );
    } catch (err) {
      err.forEach((error) => dispatch(adDalert(error,'error')));
    }
  };
};

// user registered
const userRegistered = (user) => {
  return { type: REGISTER_USER,payload: user };
};

我的钩子@H_301_1@

import { usedispatch } from 'react-redux';
import { adDalert } from '../actions/actions';

export const useFetchHook = (endpoint) => {
  const dispatch = usedispatch();
  const [ loading,setLoading ] = useState(true);

  const getData = async (endpoint) => {
    setLoading(true);

    try {
      await dispatch(endpoint);
    } catch (error) {
      await dispatch(adDalert(error,'error'));
    }
    setLoading(false);
  };

  useEffect(() => {
    getData(endpoint)
  },[])
  
  return [loading];
};

我的表格组件@H_301_1@

  const classes = useStyles();
  const [openPopup,setopenPopup] = useState(false)
  const [ loading ] = useFetchHook(fetchUsers());
  const { users } = useSELEctor((statE) => state.user);
  const [ filterFunc,setFilterFunc ] = useState({
    func: (items) => {
      return items;
    }
  });

  const dispatch = usedispatch();
  
  const { tableContainer,tableheader,tablePagination,recordsAfterSorTing } = usetable(
    users,headCells,filterFunc
  );

  const handleSearch = (E) => {
    // e.preventDefault();
    const target = e.target;
    setFilterFunc({
      func: (items) => {
        if (target.value === '') return items;
        else
          return items.filter(
            (X) =>
              x.firstname.tolowerCase().includes(target.value.tolowerCase()) ||
              x.lastname.tolowerCase().includes(target.value.tolowerCase())
          );
      }
    });
  };
  
  {loading && <h1>LOADING Users...</h1>}



  const addOrEdit = (user,handlereset) => {
    async function get() {
      try {
        await dispatch(registerUser(user));
        // history.goBACk();
      } catch (err) {
        dispatch(adDalert(err,'error'));
      }
    }
    get();
    handlereset();
    setopenPopup(false);
  };

  return (
    <div>
      <Pageheader
        title='VIEw Users'
        subtitle='IT Department'
        icon={<GroupIcon FontSize='large' />}
      />
      <Paper classname={Classes.pageContent}>
        <Toolbar>
          
          <button
            label='Add New User'
            variant='outlined'
            startIcon={<Add />}
            classname={Classes.newbutton}
            onClick={() => setopenPopup(true)}
          />

        </Toolbar>

        {!loading && (
          <React.Fragment>
            <tableContainer>
              <tableheader />

              <tableBody>
                {recordsAfterSorTing().map((item) => (
                  <tableRow key={item.ID}>
                    <tableCell>{item.ID}</tableCell>
                    <tableCell>
                      {item.firstnamE} {item.lastnamE}
                    </tableCell>
                    <tableCell>{item.is_admin ? "Yes" : "No"}</tableCell>
                  </tableRow>
                ))}
              </tableBody>
            </tableContainer>

            <tablePagination />
          </React.Fragment>
        )}
      </Paper>
      <Popup openPopup={openPopup} setopenPopup={setopenPopup} title="Add New User">
      <Registration addOrEdit={addOrEdit}/> //<-- Form as a popup
      </Popup>
    </div>
  );
}

我的表单组件@H_301_1@

const initialValues = {
  ID: '',password: '',firstname: '',lastname: '',is_admin: false
};

export default function SignUp() {
  const classes = useStyles();

  // const history = useHistory();
  const dispatch = usedispatch();

  const valIDation = (fIEldValues = formData) => {
    const temp = { ...errors };
    if ('ID' in fIEldValues)
      temp.ID = formData.ID.length !== 0 ? '' : 'employee ID is required';
    if ('firstname' in fIEldValues)
      temp.firstname = formData.firstname ? '' : 'First name is required';
    if ('lastname' in fIEldValues)
      temp.lastname = formData.lastName ? '' : 'last name is required';
    if ('password' in fIEldValues)
      temp.password =
        formData.password.length > 4 ? '' : 'password should be more than 4 characters';

    setErrors({ ...temp });
    if (fIEldValues === formData) return Object.values(temp).every((i) => i === '');
  };

  const { formData,handlereset,handleChange,errors,setErrors,setFormData } = useForm(
    initialValues,true,valIDation
  );

  const handlesubmit = async (E) => {
    e.preventDefault();
    if (valIDation()) {
      try {
        await dispatch(registerUser(formData));
        // history.goBACk();
      } catch (err) {
          dispatch(adDalert(err,'error'));
      }
      handlereset();
    }
  };

  return (
    <Container component='main' maxWIDth='xs'>
      <CSSBaseline />
      <div classname={Classes.paper}>
        <Avatar classname={Classes.avatar}>
          <LockOutlineDicon />
        </Avatar>
        <Typography component='h1' variant='h5'>
          Sign up
        </Typography>
      </div>

      {/* <form classname={Classes.form} onsubmit={handlesubmit} novalIDate> */}
      <Form onsubmit={handlesubmit}>
        <GrID container spacing={2}>
          <GrID item xs={12} sm={6}>
            <input
              name='firstname'
              label='First name'
              value={formData.firstnamE}
              onChange={handleChangE}
              ID='firstname'
              required
              error={errors.firstnamE}
            />
          </GrID>

          <GrID item xs={12} sm={6}>
            <input
              name='lastname'
              label='last name'
              value={formData.lastName}
              onChange={handleChangE}
              ID='lastname'
              required
              error={errors.lastnamE}
            />
          </GrID>

          <GrID item xs={12}>
            <input
              name='ID'
              label='employee ID'
              value={formData.ID}
              onChange={handleChangE}
              ID='ID'
              required
              type='number'
              error={errors.ID}
            />
          </GrID>

          <GrID item xs={12}>
            <input
              name='password'
              label='password'
              value={formData.passworD}
              onChange={handleChangE}
              ID='password'
              required
              type='password'
              error={errors.passworD}
            />
          </GrID>

          <GrID item xs={12}>
            <checkBox
              name='is_admin'
              label='admin Account'
              value={formData.is_admin}
              onChange={handleChangE}
            />
          </GrID>
        </GrID>

        <GrID container spacing={2}>
          <GrID item xs={12} md={6}>
            <button
              type='submit'
              fullWIDth
              variant='outlined'
              color='priMary'
              size='large'
              label='Sign Up'
            />
          </GrID>
          <GrID item xs={12} md={6}>
            <button
              fullWIDth
              size='large'
              label='reset'
              variant='outlined'
              onClick={handlereset}
              color='secondary'
            />
          </GrID>
        </GrID>
      </Form>

     
    </Container>
  );
}

我知道我已经发布了很多,我真的很抱歉,我只是不知道还能去哪里。如果有任何不清楚的地方,请告诉我,我会用更多信息更新这篇文章。@H_301_1@

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的redux store 改变时如何更新功能组件全部内容,希望文章能够帮你解决redux store 改变时如何更新功能组件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。