代码之家  ›  专栏  ›  技术社区  ›  Mehdi Souregi

reactjs:append而不是用render方法替换

  •  1
  • Mehdi Souregi  · 技术社区  · 8 年前

    我刚接触到ReactJS,心里有很多问题,比如我想追加而不是替换成render方法,

    我可以吗 安全简单 这样做?

    创建临时分区:

    var temp = document.createElement('div');
    ReactDOM.render(<NewElement />, temp);
    

    然后追加子项:

     document.getElementById("root").appendChild(temp)
    

    这是一种干净的方法吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   loelsonk    8 年前

    我认为你不应该改变外界的反应。 而不是操纵 DOM ,操纵 state 这将触发组件的新渲染。

    简单示例 JSX ,写入 ES6 以下内容:

    const MyHiddenComponent = (props) => (
      <div>
        Hello {props.name}
      </div>
    )
    
    class App extends React.Component {
     state = { toggle: false };
     
     handleToggle = () => this.setState({ toggle: !this.state.toggle });
     
     render() {
      return (
        <div>
          <button
            onClick={this.handleToggle}>{this.state.toggle ? 'hide' : 'show'}</button>
            {/* Show "Mark" only when state.toggle is true */}
            {this.state.toggle && (
              <MyHiddenComponent name="Mark" />
            )}
            {/* tenary operator */}
            {/* Show "Tom" only when state.toggle is false */}
            {/* Instead of null you can place any JSX */}
            {!this.state.toggle ? (
              <MyHiddenComponent name="Tom" />
            ) : null}
        </div>
      )
     }
    }
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    
    
    <div id="root"></div>

    编辑:

    我看了你的评论。要添加新选项卡,我们可以将新添加的选项卡存储在 状态 .为了显示选项卡,我们使用 map .

    例子:

    class AddNewTab extends React.Component {
    
       handleSubmit = (e) => {
         e.preventDefault();
              
         // get value
         const inputValue = this.refs.name.value;
         
         // we can also interrupt here if no value
         if (!inputValue) { return false }
         
         console.log('inputValue', inputValue);
         
         this.props.onAdd({
           name: inputValue
         })
         
         // reset input when we are done
         this.refs.name.value = '';
         
       }
       render() {
         return (
           <form 
             onSubmit={this.handleSubmit} 
             style={{ marginBottom: '20px' }}>
              <h1>Add new tab</h1>
              <input
                ref="name"
                type="text" 
                name="dupa" 
                placeholder="type new name" 
              />
              <button type="submit">Add new tab</button>
           </form>
         )
       }
    }
    const Tabs = (props) => {
     return (
       <div>
         {props.tabs.map((tab, i) => (
            <div key={tab.name + i}>{i + 1} {tab.name}</div>
         ))}
       </div>
     )
    }
    
    
    class App extends React.Component {
         state = { tabs: [
            { name: 'Details'},
            { name: 'Route'}
         ]};
         
         // setState triggers re-render
         handleAddNewTab = (newTab) => {
          // don't add anything if newTab.name is empty
          if (!newTab.name) { return false }
          
          this.setState({ tabs: [...this.state.tabs, newTab] });
         }
      
         
         render() {
          return (
            <div>
               <AddNewTab onAdd={this.handleAddNewTab} />
               {
                 this.state.tabs.length ? (
                    <Tabs tabs={this.state.tabs} />
                 ) : (
                   <div>No tabs</div>
                 )
               }
            </div>
          )
         }
        }
    
        ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    
    <div id="root"></div>
        2
  •  0
  •   topic    8 年前

    Here's 一个代码沙盒,演示如何以“反应方式”接近它。