【问题标题】:Displaying the nested component on the right and the parent on the left在右侧显示嵌套组件,在左侧显示父级
【发布时间】:2019-06-17 05:25:17
【问题描述】:

我有组件details 嵌套在todo 组件中。如何在右栏中显示details组件,在左栏中显示todo组件? 我可以为此使用 flexbox 吗?这种嵌套有可能吗? 还有其他方法吗?不使用 flexbox

此处代码:https://stackblitz.com/edit/react-xknr8o

待办事项

class Todos extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
  }

  render() {
    return (
      <div className="todos">
        <Todo />  
      </div>
    );
  }
}

待办事项

class Todo extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
  }

  render() {
    return (
      <div className="todo">  
        <h3>
          Todo
        </h3>
        <Details />
      </div>
    );
  }
}

详情

class Details extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
  }

  render() {
    return (
      <div className="details">
        <h3>
          Details
        </h3>
        <Paragraph />
      </div>
    );
  }
}

段落

class Paragraph extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
  }

  render() {
    return (
      <div>
        <p>
          Paragraph
        </p>
      </div>
    );
  }
}

CSS

.todos {
  border: 1px solid black;
  width: 500px;
  display: flex;
}

.todo {
  width: 250px;
  border: 1px solid yellow;
}

.details {
  width: 250px;
  border: 1px solid red;
  display:flex;
  flex-direction: column;
  justify-content: flex-end;
}


render(<Todos />, document.getElementById('root'));

【问题讨论】:

  • 我假设您不能更改源 HTML? Flexbox 只能使用通用 flex 容器更改 flex 项目的源顺序,因为 detailstodo 有不同的父级,我认为这是不可能的。
  • @Adrift 还有其他方法吗?不使用弹性盒
  • 你可以在你的容器中使用display: flex,它会并排显示组件。
  • 如果你不能改变 HTML,你只剩下浮动和绝对定位,这两者都会使元素脱离正常的格式化上下文(这会引入新的问题,比如 flex 容器不考虑流出高度)。您必须进行很多更改,即使那样它也可能并不理想。希望有人可以证明并非如此,但我个人看不到干净的方法。
  • 这是stackblitz.com/edit/react-xknr8o你想要的吗?

标签: css reactjs flexbox


【解决方案1】:

如果使用得当,您可以使用 Flexbox 布局烤鸡蛋。我稍微调整了你的代码,实际上忽略了 React 代码。在这篇文章中只有最终的 HTML 是相关的。

我添加了几行以获得 TODO 列表。

解决方案是决定你的类代表什么:

“1:N 列的行”“1:N 行的列”。确定后,您需要在.todo&gt;h3.details 上划分空间。

EXTRA当您能够修改 HTML 时,也许您想将 .todo&gt;h3 嵌入到 anchor 中并使用持久行来玩弄......

更新 从原始 CSS 中重新引入了 widthtodos, tododetails

看看接下来会发生什么(全屏并调整浏览器大小):

/* Relevant Rules*/

/* UDATE reintroduced original WIDTH on below classes */
/* still works, but looks less purdy */
.todos               { display: flex; flex-direction: column; width: 500px; }
.todo                { display: flex; flex-direction: row   ; width: 250px; }
.details             { display: none; flex-direction: column; width: 250px; } /* initially hidden */




.todo>:first-child   { flex: 1 } /* either <h3> or <a> */
.details             { flex: 4 } /* take up 4 times more space than :first-child */

.todo:hover>.details { display: flex } /* show on hover/focus only */

/* irrelevant some niceness */
h3                   { margin: 0 }

.todo                { border-bottom: 1px solid #ddd }
.todo>:first-child   { padding: .5rem } /* either <h3> or <a> */
.details             { padding: .5rem; background-color: CornSilk; color: black }
.todo:hover          { background-color: CornflowerBlue; color: CornSilk }

/*************************************/
/*EXTRA when you are able to use <a> */
/*************************************/
/*  */
.todo>a              { text-decoration: none; color: currentColor }
.todo>a:focus+.details { display: flex }
/* Will show details persistent on hover>click/tap until focus shifts */
<div id="root">
        <div class="todos">

            <div class="todo">
                <h3>plain todo Line</h3>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <a href="javascript:(void)"><h3>todo line with &lt;a&gt; click</h3></a>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <h3>plain todo Line</h3>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <a href="javascript:(void)"><h3>todo line with &lt;a&gt; click</h3></a>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <a href="javascript:(void)"><h3>todo line with &lt;a&gt; click</h3></a>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <h3>plain todo Line</h3>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <h3>plain todo Line</h3>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <h3>plain todo Line</h3>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

            <div class="todo">
                <a href="javascript:(void)"><h3>todo line with &lt;a&gt; click</h3></a>
                <div class="details">
                    <h3>Details</h3>
                    <div>
                        <p>Pro ea nonumy integre, mel at solum corpora. Id viris audiam repudiare cum, pri dolore appareat ex, per propriae detracto tacimates ex.
                            Elitr sapientem quo et, usu suas porro tibique cu. Iusto causae eos et, tota principes interesset et eos. Similique intellegam cum ei, unum
                            qualisque mel et, regione verterem delicatissimi qui ut. Aliquam incorrupte ea pro, vel veritus consequat id.</p>
                    </div>
                </div>
            </div>

        </div>
    </div>

【讨论】:

  • 您已经删除了两个元素的宽度(我相信 OP 无法更改此值)并且 todo 不需要 flex-direction: row,因为它是初始值。
  • 这是一个展示原则的 tut,当然 OP 可以阅读 FBL 规格。为什么不自己想出一个好的替代解决方案。
  • 我愿意,但 OP 需要澄清是否可以更改 width 之类的内容。我不是在批评您的解决方案,而是希望 OP 知道某些事情发生了变化。
  • 在我的书中没有提到约束意味着“免费”。但这无关紧要,无论有没有尺寸限制,基本思想都是如此。顺便说一句,.details.todo 的子代,它是 .todos 的子代,与您之前在评论中提到的相反。
  • 为了完全确定,OP 问道:“我可以为此使用 flexbox 吗?这种嵌套有可能吗?还有别的办法吗?事不宜迟...
猜你喜欢
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多