【问题标题】:How do I avoid repeatedly typing methods that create nodes and append nodes?如何避免重复键入创建节点和附加节点的方法?
【发布时间】:2018-07-15 04:40:53
【问题描述】:

我已经研究了我的问题,但没有提出任何问题。我可能缺少与问题相关的正确流行语......

我在对象内部有一个方法,它创建 p 元素,然后将它们附加到无序列表中,它工作正常,但我无法弄清楚如何通过不重复键入 document.createElement(' p') 或重复输入 node.appendChild('p') 方法。

注意:我省略了一些显示功能的代码部分,但我认为我的问题仍然可以说明这一点。

当我输入我的代码时,我要么得到多个持有 document.createElement('p') 的变量,就像你在 pEl1、pEl2 和 PEl3 中看到的那样。

var totalCompletedTodos = 0,
    totalRemainingTodos = 0,
    todosUl = document.querySelector('ul'),
    todosLi = todosUl.appendChild(document.createElement('li')),
    pEl1 = document.createElement('p'),
    pEl2 = document.createElement('p'),
    pEl3 = document.createElement('p');

todosLi.appendChild(pEl1).textContent = "Toggle All ";
todosLi.appendChild(pEl2).textContent = "Completed: ";
todosLi.appendChild(pEl3).textContent = "Remaining: ";
todosLi.className = 'liInfoBar';
document.querySelector('.liInfoBar > p').className = "toggleAllButton";

或者我最终会不断写出多个 todosLi.appendChild(document.createElement('p')).textContent = "string";

var totalCompletedTodos = 0,
    totalRemainingTodos = 0,
    todosUl = document.querySelector('ul'),
    todosLi = todosUl.appendChild(document.createElement('li'));

todosLi.appendChild(document.createElement('p')).textContent = "Toggle All";
todosLi.appendChild(document.createElement('p')).textContent = "Completed: ";
todosLi.appendChild(document.createElement('p')).textContent = "Remaining: ";
todosLi.className = 'liInfoBar';
document.querySelector('.liInfoBar > p').className = "toggleAllButton";

再次: 我不是在寻求有关功能的帮助,而是寻求有关如何生成可重用代码以使其最小化的帮助。作为一个初学者,我正在努力将时间用于生成最小、干净、可读的代码以及生成功能,这就是我提出这个问题的原因。

对于我正在寻找的东西可能没有答案,唯一的方法就是不断地写出来,但我发现自己在整个剧本中都在这样做,我觉得必须有一种方法。

免责声明:这是我在 Stackoverflow 上的第一篇文章,希望我以一种可以理解的方式表达了我的问题。如果不是,我也会接受有关正确提问的反馈。

谢谢!

【问题讨论】:

  • 我推荐 ObjectArray 方法,例如["Toggle All", "Completed: ", "Remaining: "].map((textContent) => Object.assign(document.createElement("p"), {textContent})) 创建一个包含三个 <p> 元素及其各自文本的数组。
  • 现在看起来应该是 for (let str of ["Toggle All ", "Completed: ", "Remaining: "]) { todosLi.appendChild(document.CreateElement('p')).textContent = str }

标签: javascript readability


【解决方案1】:

为了减少重复,创建一个函数,您可以将父节点、创建的节点的类型以及您需要的任何其他属性传递给该函数。例如:

const append = (
  parent,
  childType,
  otherProps
) => {
  const child = parent.appendChild(document.createElement(childType));
  if (otherProps) Object.assign(child, otherProps);
  return child;
};
const ul = document.querySelector('ul');
const li = append(ul, 'li', { className: 'liInfoBar' });
append(li, 'p', { textContent: 'Toggle All' });
append(li, 'p', { textContent: 'Completed' });
append(li, 'p', { textContent: 'Remaining' });
.liInfoBar {
  background-color: yellow;
}
<ul></ul>

或者您也可以使用执行此类操作的库之一。 (但是你确定你想让ps 成为这样的li 的孩子吗?事实上,它看起来有点奇怪)

【讨论】:

  • 好吧,这是有道理的,所以这几乎就像制作一个像 JQuery 这样的个性化库?我知道有库,但我试图在了解 javascript 的基础知识时避免使用它们。另外,我认为既然您提到它,我应该附加跨度而不是 p。我有多个项目附加到一个 li 所以跨度可能更有意义。感谢您的帮助!
  • 是的,有点像。但是,如果您只是在学习,编写自己的函数来完成类似的事情绝对没有错,这样您的代码看起来更加抽象和简洁,并且您可以掌握在没有库的情况下是如何工作的。
【解决方案2】:

当你需要对多条数据做同样的事情时,是时候循环了!

const paragraphs = [
    'Toggle All',
    'Completed: ',
    'Remaining: '
];
paragraphs.forEach((text) => {
    todosLi.appendChild(document.createElement('p')).textContent = text;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2020-03-19
    相关资源
    最近更新 更多