React基础:片段(fragments)、插槽、ref

片段

片段的作用是为了防止往DOM节点中插入一些不必要的标签

 class Ul extends React.Component {
     constructor(props) {
       super(props);
       this.state = {};
     }
     render() {
       return (
         <ul>
           <Li />
         </ul>
       );
     }
   }

   class Li extends React.Component {
     constructor(props) {
       super(props);
       this.state = {};
     }
     render() {
       return (
         <div>
           <li>床前明月光,疑是地上霜。</li>
           <li>举头望明月,低头思故乡。</li>
         </div>
       );
     }
   }
   ReactDOM.render(<Ul />, document.getElementById("example"));

运行结果:
在这里插入图片描述
我们想要的结果是ul中直接插入li标签,而不是li标签外还有一层div标签
要想解决这个问题,可以使用<React.Fragment></React.Fragment> 来替换div标签

render() {
    return (
      <React.Fragment>
        <li>床前明月光,疑是地上霜。</li>
        <li>举头望明月,低头思故乡。</li>
      </React.Fragment>
    );
  }

在这里插入图片描述
这样就不会有多余的div标签

插槽

vue与react插槽的区别

  • vue的插槽需要在组件中定义slot标签,并且在引用的时候要对应slot标签上的插槽名。
  • react的插槽直接将dom写到组件的标签下然后子组件通过this.props.children获取到放入的dom元素,这个dom元素可以设置key属性来区分每一个元素。然后在组件中直接将dom当成组件引入到render中。
  class Solt extends React.Component {
      constructor(props) {
        super(props);
        this.state = {};
        console.log(this.props.children);
        console.log(this.props.children[0].props);
        
      }
      render() {
        return <div></div>;
      }
    }

    ReactDOM.render(
      <Solt>
        <p flog="p1">段落1</p>
        <p flog="p2">段落2</p>
      </Solt>,
      document.getElementById("example")
    );

在这里插入图片描述
从图片中可以看出this.props.children是一个元素为对象的数组,每一个对象的props属性包好了我们需要的内容。根据这我们可以通过条件语句来确认每一个组件的位置

 class Solt extends React.Component {
    constructor(props) {
      super(props);
      this.state = {};
      console.log(this.props.children);
      console.log(this.props.children[0].props);
    }
    render() {
      return (
        <div>
          {/* 标题 */}
          <h1>{this.props.title}</h1>
          {/* 内容 */}
          <div>
            {Array.isArray(this.props.children)
              ? this.props.children.map(child => {
                  return this.renderChild(child);
                })
              : this.props.children &&
                this.renderChild(this.props.children)}
          </div>
        </div>
      );
    }
    /* 控制内容分发*/
    renderChild(child) {
      if (child.props.flog === "p") {
        return <div key="1">{child}</div>;
      } else {
        return <div key="2">{child}</div>;
      }
    }
  }

  ReactDOM.render(
    <Solt title="插槽">
      <p flog="p">段落1</p>
      <p flog="p2">段落2</p>
    </Solt>,
    document.getElementById("example")
  );

在这里插入图片描述

ref

React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上。
这个特殊的属性允许你引用 render() 返回的相应的支撑实例.这样就可以确保在任何时间总是拿到正确的实例。

class MyComponent extends React.Component {
  handleClick() {
    // 使用原生的 DOM API 获取焦点
    this.refs.myInput.focus();
  }
  render() {
    //  当组件插入到 DOM 后,ref 属性添加一个组件的引用于到 this.refs
    return (
      <div>
        <input type="text" ref="myInput" />
        <input
          type="button"
          value="点我输入框获取焦点"
          onClick={this.handleClick.bind(this)}
        />
      </div>
    );
  }
}
 
ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值