0

我想在询问者的下一个问题中使用上一个答案,这是我的代码:

const promptForMissingOptions = async (options) => {
  const questions = [];

  if (!options.name) {
    questions.push({
      type: "input",
      name: "name",
      message: "Name:",
    });
  }

  if (!options.file) {
    questions.push({
      type: "checkbox",
      name: "lots",
      message: "Select the categories:",
      pageSize: 30,
      choices: () => {
        const files = helpers.getFileNames();
        return Object.keys(files);
      },
    });
  }

  if (answers.lots) {
    questions.push({
      type: "checkbox",
      name: "files",
      message: "Select the files:",
      pageSize: 50,
      choices: () => {
        const choices = helpers.getFileNames();
        return Object.keys(
          Object.keys(x)
            .filter((key) => answers.lots.includes(key))
            .reduce((obj, key) => {
              obj[key] = x[key];
              return obj;
            }, {})
        ).reduce(
          (r, k) =>
            r.concat(
              new inquirer.Separator(
                chalk.underline.bold.bgMagenta(
                  "------------------------ " + k + " ------------------------"
                )
              ),
              choices[k]
            ),
          []
        );
      },
    });
  }

  const answers = await inquirer.prompt(questions);

  return {
    files: options.file ? [options.file] : answers.files,
    name: options.name || answers.name,
  };
};


let options = await promptForMissingOptions(options);

我在这里要做的是将第二个问题的答案用于第三个问题。

我在这里尝试了解决方案:在呈现提示时,是否有办法在查询器中使用先前的答案(inquirer v6)?

这对我的情况不起作用。

我该如何解决这个问题?

提前致谢。

4

1 回答 1

2

在回答您的问题之前,我想指出一些对您的示例代码有帮助的优化:

您当前使用此功能的位置:

const questions = [];

if (!options.name) {
  questions.push({ question });
}

您可以通过以下方式实现相同的目标:

const questions = [{
  type: "input",
  name: "name",
  message: "Name:",
  when: () => options.name,
}];

文档中的两点:

when : (Function, Boolean) 接收当前用户的答案 hash 并且应该返回trueorfalse取决于是否应该问这个问题。该值也可以是一个简单的布尔值。

这里的措辞有点误导,但归根结底是,当您分配给的函数when被调用时,它会将当前用户的答案作为第一个参数传递给它,最终您的函数必须返回truefalse确定是否它应该显示给用户。

选择:(数组|函数)选择数组或返回选择数组的函数。如果定义为函数,则第一个参数将是当前询问者会话答案。[...]

描述确实继续讨论可能的答案值类型,但这里的关键要点是第一个函数参数:“当前查询者会话答案”。在问题 3 中,您可以访问问题 2的答案。

另外,只是在这里提出一点“个人意见”,我强烈建议您将依赖于问题处理程序的逻辑Object.keys() 移出choices。而是在调用时将生成的名称数组传递给问题(即:您当前的options论点)。如果结构的任何方面发生变化,它很可能会在其他地方发生变化;如果您在此处保留此逻辑,则对该逻辑的所有更改都需要在代码中的两个位置进行更新。


现在,要将这个概念应用于您的示例问题数组,为了简洁起见,我将使用一个应用上述概念的示例。

const promptForMissingOptions = async (options) => {
  const questions = [
    {
      type: "input",
      name: "name",
      message: "Name:",
      when: () => options.name,
    },
    {
      type: "checkbox",
      name: "lots",
      message: "Select the categories:",
      when: () => options.file,
      pageSize: 30,
      choices: () => options.categoryChoices,
    },
    {
      type: "checkbox",
      name: "files",
      message: "Select the files:",
      when: () => answers.lots.length,
      pageSize: 50,
      choices: (answers) => {
        const filteredList = [];
        const selectedCategories = answers.lots; // where the ID is the relevant question's "name".
        // now do your "filter" handling here..
        return filteredList;
      },
    },
  ];

  const answers = await inquirer.prompt(questions);

  return {
    files: options.file ? [options.file] : answers.files,
    name: options.name || answers.name,
  };
};

let options = await promptForMissingOptions(options);

我相信代码本身和问题 3 中的小注释在这里应该足够清楚,但请让我知道这是否有帮助?

于 2021-09-20T13:32:00.933 回答