テーブル リスト フィルタの結果は変更されません

シナリオの説明:

リスト ページでテーブルがスクリーニングされた後、クリックして詳細を入力するか、新しいテーブルを追加してから戻っても、リストのスクリーニング結果は変更されません。

実装原則:

1. [追加] または [編集] をクリックすると、フィルター処理された値を取得し、その値を sessionStorage (searchData) に保存し、別の値を保存して、リスト ページのパス (urlLink) を保存します。
2. リストとフィルターから呼び出される関数(handleSubmit())で、
①判断、リストの下ではなく、新規または編集ページから他のページにジャンプし、ページ パスが保存されたリスト パスではないことを判断して、保存 他のリストのデータに影響を与えないように、フィルタリングされたデータをクリアします
② 判断、追加または編集からリスト ページに戻り、データを取り出してレンダリングします
再フィルタリングまたはレンダリングに戻るジャンプに関係なく、sessionStorage が必要ですクリアする。
3. 新規または編集ページが正常に追加または編集された後に一覧ページに戻った場合、フィルター処理されたデータを保持する必要はなく、正常に追加した後に sessionStorage をクリアする必要があります。

コードは以下のように表示されます:

<Button type="primary" style={
    
    {
    
     marginBottom: '30px' }} 
	onClick={
    
    async () => {
    
    
    const values = await this.form.validateFields();
    const {
    
     pageNumber, pageSize } = this.state;
    sessionStorage.setItem(
      "searchData",
      JSON.stringify({
    
     values: values, pageNumber, pageSize })
    );
    sessionStorage.setItem(
      "urlLink",
      window.location.pathname
    );
    this.props.history.push({
    
    
      pathname: "/marketing/couponCode/_/add",
    });
  }}>新增</Button>
{
    
    
      title: "操作", dataIndex: "operator", width: 90,
      render: (value, record) => {
    
    
        const {
    
     id } = record
        const items = [
          {
    
    
            label: '查看',
            onClick: async () => {
    
    
              const values = await this.form.validateFields();
              const {
    
     pageNumber, pageSize } = this.state;
              sessionStorage.setItem(
                "searchData",
                JSON.stringify({
    
     values: values, pageNumber, pageSize })
              );
              sessionStorage.setItem(
                "urlLink",
                window.location.pathname
              );
              this.props.history.push({
    
    
                pathname: "/marketing/couponCode/_/check",
                state: {
    
     id: id, type: "check" },
              });
            },
          }
        ]
        return <Operator items={
    
    items} />;
      }
    },
componentDidMount() {
    
    
    this.handleSubmit();
  }

  handleSubmit = async () => {
    
    
    if (this.state.loading) return;
    if (window.location.pathname != sessionStorage.getItem("urlLink")) {
    
    
      sessionStorage.removeItem("searchData")
    }

    if (sessionStorage.getItem("searchData")) {
    
    
      const {
    
     values, pageNumber, pageSize } = JSON.parse(
        sessionStorage.getItem("searchData")
      );
      this.form.setFieldsValue({
    
     ...values });
      this.state.pageNumber = pageNumber;
      this.state.pageSize = pageSize;
    }
    const values = await this.form.validateFields();
    // 生成时间
    const createStartTime = !values.createTime ? '' : moment(values.createTime[0]._d).format('YYYY-MM-DD 00:00:00')
    const createEndTime = !values.createTime ? '' : moment(values.createTime[1]._d).format('YYYY-MM-DD 23:59:59')
    const {
    
     pageNumber, pageSize } = this.state;
    const params = {
    
    
      ...values,
      pageNumber,
      pageSize,
      createStartTime,
      createEndTime
    };
    this.setState({
    
     loading: true });
    this.props.ajax
      .post("/market/discount/page", params)
      .then((res) => {
    
    
        if (res.success) {
    
    
          const dataSource = res.data.records || [];
          sessionStorage.removeItem("searchData")
          sessionStorage.removeItem("urlLink")
          const total = res.data.total || 0;
          this.setState({
    
     dataSource, total });
        }
      })
      .finally(() => this.setState({
    
     loading: false }));
  };
 this.props.ajax.post('/market/discount/update', params)
            .then(res => {
    
    
                if (res.state === 1) {
    
    
                    sessionStorage.removeItem("searchData")
                    sessionStorage.removeItem("urlLink")
                    message.success('保存成功')
                    this.props.history.goBack();
                }
            })

React の setState コールバック関数の詳細な説明

setState() は常にすぐにコンポーネントを更新するとは限りません。更新をバッチ処理するか、後日まで更新を延期する場合があります。これにより、 setState() を呼び出した直後に this.state を読み取ることが潜在的な落とし穴になります。代わりに、 componentDidUpdate またはsetState コールバック ( setState(updater, callback) )を使用してください。どちらも更新が適用された後に起動することが保証されています。

React を使用する過程で、必要な特定の状態にアクセスするために this.state を使用できますが、状態を更新または変更する必要がある場合、一般的に言えば、状態を更新する目的を達成するために setState() 関数を使用します。 , setState() 関数の実行により、ページがトリガーされ、UI が再レンダリングされます。しかし!! ! setState は非同期です! ! !

1. 文法:

 setState(updater[, callback]) //

updater は変更される状態オブジェクトで、callback は状態によって引き起こされるページの再レンダリングのためのコールバックで、componentDidUpdate と同等です。一般的に、ページ
の状態を設定するときは、最初に状態を設定する必要があります。次に、ページのいくつかのパラメーターを変更します。変更するときは、setState のコールバック関数を使用できます。

2.違いを分析する

コールバックでパラメーターを使用する代わりに、設定直後の状態を使用します。

 this.state = {
    
    foo: 1}; this.setState({
    
    foo: 123}); console.log(this.state.foo); // 1

コールバックで設定された状態を呼び出す

 this.state = {
    
    foo: 2}; this.setState({
    
    foo: 123}, ()=> {
    
     console.log(foo); // 123 });

setState のコールバック関数の機能はほぼ同じで、この関数は componentDidUpdate 関数に相当し、ライフサイクルの関数に似ています。

<Table
   loading={
    
    loading}
     columns={
    
    this.columns}
     dataSource={
    
    dataSource}
     rowKey="id"
     pageNum={
    
    pageNumber}
     pageSize={
    
    pageSize}
   />
   <Pagination
     total={
    
    total}
     pageNum={
    
    pageNumber}
     pageSize={
    
    pageSize}
     showTotal={
    
    total => `总条数: ${
      
      total}`}
     onPageNumChange={
    
    (pageNum) =>
       this.setState({
    
     pageNumber: pageNum }, () => this.handleSubmit())
     }
     onPageSizeChange={
    
    (pageSize) =>
       this.setState({
    
     pageSize, pageNumber: 1 }, () => this.handleSubmit())
     }
   />

おすすめ

転載: blog.csdn.net/weixin_53125679/article/details/125292957
おすすめ