首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提供新timeDimensions时,Cube.js QueryBuilder不会重新呈现

提供新timeDimensions时,Cube.js QueryBuilder不会重新呈现
EN

Stack Overflow用户
提问于 2019-08-10 17:16:23
回答 1查看 532关注 0票数 1

我正在尝试让cube.js客户端显示的数据过滤与timeDimensions属性提供的数据。

我正在尝试所有最新的版本。

我尝试过QueryBuilder render props method updateTimeDimensions (codesandbox)。已尝试更新时间维度并传递给query属性(codesandbox)。

下面是传球道具的版本:

代码语言:javascript
复制
const App = () => {
  const [dateRange, updateDateRange] = useState([
    moment("2019-01-01").format(defaultFormat),
    moment('2019-04-01').format(defaultFormat)
  ]);
  const query = {
    timeDimensions: [
      {
        dimension: "LineItems.createdAt",
        granularity: "month",
        dateRange
      }
    ]
  }
  console.log(query)
  console.log(dateRange)
  return (
    <>
      <RangePicker
        defaultValue={[moment("2019-01-01"), moment('2019-04-01').startOf("day")]}
        onChange={([startDate, endDate]) => {
          updateDateRange([
            startDate.format(defaultFormat),
            endDate.format(defaultFormat)
          ]);
        }}
      />
      {dateRange && <QueryBuilder
        query={query}
        cubejsApi={cubejsApi}
        render={({
          resultSet,
          measures,
          availableMeasures,
          updateMeasures
        }) => (
          <Layout.Content style={{ padding: "20px" }}>
            <Select
              mode="multiple"
              style={{ width: "100%" }}
              placeholder="Please select"
              onSelect={m =>
                updateMeasures.add(find(propEq("name", m))(availableMeasures))
              }
              onDeselect={m =>
                updateMeasures.remove(
                  find(propEq("name", m))(availableMeasures)
                )
              }
            >
              {availableMeasures.map(measure => (
                <Select.Option key={measure.name} value={measure.name}>
                  {measure.title}
                </Select.Option>
              ))}
            </Select>
            <Divider />
            {measures.length > 0 ? (
              <ChartRenderer resultSet={resultSet} />
            ) : (
              <Empty description="Select a measure and date range to get started" />
            )}
          </Layout.Content>
        )}
      />}

    </>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

按预期更改日期范围时,日志显示dateRange。但更改日期范围时不会触发cube.js组件重新呈现。

代码语言:javascript
复制
Object {timeDimensions: Array[1]}
["2019-01-01", "2019-04-01"]
Object {timeDimensions: Array[1]}
["2019-01-01", "2019-04-30"]
Object {timeDimensions: Array[1]}
["2019-01-01", "2019-05-31"]
EN

回答 1

Stack Overflow用户

发布于 2019-08-11 09:24:01

当调用updateDateRange时,它会覆盖QueryBuilder的整个query状态,从而删除之前设置的所有measures。当您在QueryBuilder外部维护query状态时,您应该传递setQuery,以便在QueryBuilderhttps://cube.dev/docs/@cubejs-client-react#query-builder-props更改状态时更新您自己的状态

请在此处查看更新的示例:https://codesandbox.io/s/react-query-builder-with-cubejs-4jwj5

代码语言:javascript
复制
const App = () => {
  const [dateRange, updateDateRange] = useState([
    moment("2019-01-01").format(defaultFormat),
    moment("2019-04-01").format(defaultFormat)
  ]);

  const [query, setQuery] = useState({});

  const applyNewQuery = query => {
    let newQuery = query;
    if (newQuery.timeDimensions && newQuery.timeDimensions[0]) {
      newQuery = {
        ...newQuery,
        timeDimensions: [
          {
            ...newQuery.timeDimensions[0],
            dateRange,
            granularity: "month"
          }
        ]
      };
    }
    setQuery(newQuery);
  };

  useEffect(() => {
    applyNewQuery(query);
  }, [dateRange]);

  return (
    <>
      <RangePicker
        defaultValue={[
          moment("2019-01-01"),
          moment("2019-04-01").startOf("day")
        ]}
        onChange={([startDate, endDate]) => {
          updateDateRange([
            startDate.format(defaultFormat),
            endDate.format(defaultFormat)
          ]);
        }}
      />
      {dateRange && (
        <QueryBuilder
          query={query}
          setQuery={applyNewQuery}
          cubejsApi={cubejsApi}
          render={({
            resultSet,
            measures,
            availableMeasures,
            updateMeasures
          }) => (
            <Layout.Content style={{ padding: "20px" }}>
              <Select
                mode="multiple"
                style={{ width: "100%" }}
                placeholder="Please select"
                onSelect={m =>
                  updateMeasures.add(find(propEq("name", m))(availableMeasures))
                }
                onDeselect={m =>
                  updateMeasures.remove(
                    find(propEq("name", m))(availableMeasures)
                  )
                }
              >
                {availableMeasures.map(measure => (
                  <Select.Option key={measure.name} value={measure.name}>
                    {measure.title}
                  </Select.Option>
                ))}
              </Select>
              <Divider />
              {measures.length > 0 ? (
                <ChartRenderer resultSet={resultSet} />
              ) : (
                <Empty description="Select a measure and date range to get started" />
              )}
            </Layout.Content>
          )}
        />
      )}
    </>
  );
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57440860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档