当前位置: 首页 > 面试题库 >

反应条件渲染模式

雍河
2023-03-14
问题内容

我已经实现了一个Modal组件,该组件在屏幕上显示一个模态对话框。通常,模态将有条件地显示。我可以通过两种方法在render函数中执行此操作:

render(){
    ...
    <Modal show={this.state.showModal}>
        // something in modal
    </Modal>
}

在Modal组件中,我使用this.props.show为其自身添加了一个不同的类。如果为假,它将添加display:none以隐藏模式。

另一种方式是这样的:

render(){
    ...
    { this.state.showModal &&
        (<Modal>
            // something in modal
        </Modal>)
    }
}

这用于showModal确定是否在渲染中添加Modal。

我想找出的是:

  1. 这两种方式有何不同?
  2. 其中一个比另一个更好吗?
  3. 还有另一种方法吗?

编辑:似乎不同的人有不同的偏好。对我自己而言,我更喜欢@ErikTheDeveloper所说的内容。显示/隐藏模态的功能应保留在模态内部,并且当我们不需要显示模态时,可以在模态中返回null。

我认为也许还没有哪个更好的答案。也许这只是个人选择?


问题答案:

从那时起,我在React上度过了很多时间,并在此过程中吸取了一些教训。

我发现这种通用方法可以很好地处理模态:使用一个完全受控的“哑巴”组件,它需要3个道具。

  • show:布尔-模态可见吗?
  • close:功能-模态需要回调才能关闭自身
  • children:节点-模态的内容

请参阅React
Docs以获取有关受控组件的信息

要回答有关两者之间的区别的问题,是IMO选项1提供了更清洁,更灵活的API来使用,而选项2则更加简化。

使用选项1时,您可以使用CSS
null从返回,以进行隐藏/显示<Modal>。我建议返回,null因为模态内容将不会被渲染,而是通过CSS渲染和“隐藏”它们。

选项2强制使用更为冗长的“ JSX方式”进行条件渲染,我认为这在许多情况下是适当的。但是我觉得模态的概念值得隐藏/显示是<Modal>组件API
的一部分(props / methods / etc …)

为什么要传递close道具/回调?

考虑到大多数模态具有用户体验,例如关闭事件,例如:按下[ESC],单击“ x”,在模态之外单击等…需要通过传递close道具通知模态如何“自行关闭”
/ callback在下面的示例中。

程式码范例

// The simple, fully controlled Modal component
const Modal = React.createClass({
  render() {
    const {
      show,     // Boolean - Is the modal visible?
      close,    // Function - The modal needs a function to "close itself"
      children, // node - The contents of the modal 
    } = this.props;
    return !show ? null : (
      <div className="some-class-for-styling">
        <a onClick={close}>x</a>
        {children}
      </div>
    );
  }
});

const UsesModal = React.createClass({
  setEditing(editing) {
    this.setState({editing});
  },

  render() {
    // `editing` could come from anywhere. 
    // Could be derived from props, 
    // or managed locally as state, anywhere really....
    const {editing} = this.state;
    return (
      <div>
        <h1>Some Great Component</h1>
        <a onClick={() => this.setEditing(true)}>Show Modal!</a>
        <Modal show={editing} close={() => this.setEditing(false)}>
          Some great modal content... show based on UsesModal.state.editing
        </Modal>
      </div>
    );
  }
});

而且,如果您想让模态管理自己的状态,则可以使用稍微更聪明的组件来包装“哑巴”模态,并使用refs和“公共组件方法”(尽管我发现坚持使用简化方法通常会减少头痛和后悔;))

const SmarterModal = React.createClass({
  close() {
    this.setState({show: false});
  },

  open() {
    this.setState({show: true});
  },

  render() {
    const {children} = this.props;
    const {show} = this.state;
    return (
      <Modal show={show} close={this.close}>
        {children}
      </Modal>
    );
  }
});

const UsesSmarterModal = React.createClass({
  render() {
    return (
      <div>
        <h1>Some Great Component</h1>
        <a onClick={() => this.refs.my_smarter_modal.open()}>Show Modal!</a>
        <SmarterModal ref="my_smarter_modal">
          Some great modal content... show based on SmarterModals own internal state
        </SmarterModal>
      </div>
    );
  }
});

您可以通过多种方式来包装简单的代码<Modal>,但是我觉得它可以作为坚实的基础,并且数据流可以很好地发挥作用,以允许从最有意义的地方计算/得出“模式开放”。这是我发现很好工作的方法。



 类似资料:
  • Mpx中的条件渲染与原生小程序中完全一致,详情可以查看这里 简单示例如下: <template> <view class="container"> <!-- 通过 wx:if 的语法来控制需要渲染的元素 --> <view wx:if="{{ score > 90 }}"> A </view> <view wx:elif="{{ score > 60 }}"> B </

  • 所以就像标题所说的,我的应用程序的主页因为某种原因渲染了两次,我不知道为什么。从我的浏览器路由器,我最初调用一个JS文件,从那里我调用我的HomePage组件和React路由器,但然后我的页面渲染两次,我不知道为什么。 我的浏览器路由器(index.js): 然后pp.js被称为: 然后我的主页组件(index.jsx): 和路线。js: 但是我的页面是这样渲染的: 我真的很困惑,所以任何建议都会

  • 主要内容:React 实例,元素变量,React 实例,与运算符 &&,React 实例,三目运算符,阻止组件渲染,React 实例在 React 中,你可以创建不同的组件来封装各种你需要的行为。然后还可以根据应用的状态变化只渲染其中的一部分。 React 中的条件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI。 先来看两个组件: 我们将创建一个 Greeting 组件,它会根据用户

  • v-if 在字符串模板中,如 Handlebars ,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}} <h1>Yes</h1> {{/if}} 在 Vue.js ,我们使用 v-if 指令实现同样的功能: <h1 v-if="ok">Yes</h1> 也可以用 v-else 添加一个 "else" 块: <h1 v-if="ok">Yes</

  • 问题内容: 我有一个应用程序,需要动态设置元素的高度(让我们说“ app-content”)。它获取应用程序“ chrome”的高度,然后减去它的高度,然后将“ app- content”的高度设置为在这些限制内适合100%。这对于香草JS,jQuery或Backbone视图来说非常简单,但是我正在努力弄清楚在React中执行此操作的正确过程是什么? 以下是一个示例组件。我希望能够将的高度设置为窗

  • 6.1 渲染模板 一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。 map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。 它的渲染函数有一个可选的变量键值对map 通过 ctx.Render() 方法来渲染模板,例如: func (r *Render) Serve(ctx *faygo.Context) error { return ctx.Ren