美文网首页
react_Kons

react_Kons

作者: debt | 来源:发表于2016-08-22 11:06 被阅读30次

    03 what's your name!

    var test = (<div>
    <p>Hey there. Enter your name.</p>
     <input type="text" name="name" onChange={this.onNameChange} />
        </div>);
        if(this.state.name.length === 0)
          return test;
        else{
          return (
            <div>
              <p>Hello {this.state.name}</p>
              <input type="text" name="name" onChange={this.onNameChange} />
            </div>
          );
        }
    

    05 GroceryList 01

    Properties are a way to pass parameters to your React components.Properties are to React components what attributes are to HTML elements.

    state 更像是把值赋给一个组件,通常初始一个state,然后父组件像这样子<component test={this.state.xx} key={index}/> 然后子组件就可以return(<p key={this.props.key}>{this.props.test.xx}</p> )渲染了,就基本是这个套路。

    class GroceryList extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          groceries: [ { name: "Apples" } ]
        };
      }
      render() {
        let groceriesComponents = [];
        // Properties are a way to pass parameters to your React components.
        // We mentioned this in the third exercise. Properties are to React
        // components what attributes are to HTML elements.
        //
        // Below you can see how to pass properties to child components.
        // We have defined a `grocery` property for each `GroceryListItem`.
        for(var index = 0; index < this.state.groceries.length; index++) {
          groceriesComponents.push(
              <GroceryListItem
                grocery={this.state.groceries[index]}
                key={index}
              />
          );
        }
        // Hint: Don't forget about putting items into `ul`
        return (
          <div>
            // Put your code here
            <ul>
             {groceriesComponents}
            </ul>
          </div>
        );
      }
    }
    // Render grocery name from component's properties.
    // If you have a problem, check `this.props` in the console.
    class GroceryListItem extends React.Component {
      constructor(props) {
        super(props);
      }
      render() {
              // Put your code here.
             return(
                <li key={this.props.key}>{this.props.grocery.name}</li>
              )
      }
    }
    

    05 GroceryList 02

    通过这个练习基本熟悉了state的用法,首先state一般用于设置初始值,然后通过setState({key:val})设置,注意,这里只要一使用setState就会触发重新渲染render()方法,然后在后续组件中想办法使之改变。
    (遇到问题想办法解决,一步一步来,注意看浏览器报错.使用console.log来打印每一步的状态)

    var React = require("react");
    // We continue our journey with reactive grocery list. We implemented the previous
    // task ourselves. You can see our example implementation.
    //
    // Task: You have to implement adding items to the list. Create the implementation
    //       of the `addGroceryItem` method. This method should modify the `GroceryList`
    //       component's state and by that re-render this component.
    //
    //       You need to render an input and button in `GroceryList` (after the
    //       groceries list). Users will use them as an input for new groceries.
    //
    //       We prepared two components for you. Please render the button and
    //       input under your list and define the `onClick` handler for the button.
    //
    //       Hint: See `render` method body. Look for `newProductInput` and
    //             `newProductAddButton` variables
    //
    //       Do you remember how we used `onChange` event in the third exercise?
    
     // 问题1 到底是拼接之后还是替换 
     //  问题2 先实现改变就回显的功能,现在是只要光标以改变就会重新setState
    
    class GroceryList extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          groceries: [
            { name: "Apples" }
          ],
          newGroceryName: ""
        };
    //  这里的bind 是几个意思??
        this.addGroceryItem = this.addGroceryItem.bind(this);
        this.inputChanged = this.inputChanged.bind(this);
      }
      // Warning: You shouldn't change this method
      inputChanged(event) {
        this.setState({newGroceryName: event.target.value});
      }
      // Fill the definition of the following method to allow adding new items to the list
      // Hint #1: You should use the `concat` function to modify groceries list.
      // Hint #2: Remember about the case where input is empty.
      // Hint #3: Name of the new grocery item will be stored in `this.state.newGroceryName`.
      addGroceryItem() {
        // Put your code here
         //console.log(this.state);
         if(this.state.newGroceryName){
        var groceriesVal= this.state.groceries.concat({'name':this.state.newGroceryName});
      this.setState({groceries:groceriesVal})
    }
      }
      render() {
    
        let groceriesComponents = [],
            newProductInput,
            newProductAddButton;
    
        for(var index = 0; index < this.state.groceries.length; index++) {
          groceriesComponents.push(
              <GroceryListItem
                grocery={this.state.groceries[index]}
              />
          );
        }
        // Here are components for task #2.
        newProductInput = <input className='new-item' type="text" onChange={this.inputChanged}/>;
        // Something is missing here... Will anything happen if you click this button now?
        newProductAddButton = <button className='add-product' onClick={this.addGroceryItem}>Add new Product</button>;
        return (
          <div>
            <ul>
              {groceriesComponents}
              {newProductInput}
              {newProductAddButton}
            </ul>
          </div>
        );
      }
    }
    class GroceryListItem extends React.Component {
      constructor(props) {
        super(props);
      }
      render() {
        return (<li>{this.props.grocery.name}</li>);
      }
    }
    export default GroceryList;
    
    

    todolist

    任务相当于做一个类似于todolist的东西,点击改变样式.
    思路是给每个li绑定点击事件,然后反转这个li下的complete属性,最后自然是setState。难点是可能没有想到给每个item 加index 导致无法绑定。多思考,多看提示会少踩坑
    (这段代码没有写出来,主要原因是因为不理解bind方法,然后没有理解传参那一步。)

    class GroceryList extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          groceries: [
            {
              name: "Apples",
              completed: false
            }
          ],
          newGroceryName: ""
        };
    
        this.addGroceryItem = this.addGroceryItem.bind(this);
        this.clearList = this.clearList.bind(this);
        this.inputChanged = this.inputChanged.bind(this);
      }
    
      inputChanged(event) {
        this.setState({ newGroceryName: event.target.value });
      }
    
      addGroceryItem() {
        if(this.state.newGroceryName) {
          let newGroceryItem = { name: this.state.newGroceryName };
          this.setState({
            groceries: this.state.groceries.concat([newGroceryItem])
          });
        }
      }
    
      clearList(event) {
        this.setState({groceries: []});
      }
    
      // Fill the definition of the following method to allow completing each item
      // Hint 1: Pay attention to the element's index on the list.
      toggleGroceryCompleteness(groceryIndex) {
        var groceryCompleted = this.state.groceries[groceryIndex].completed;
    
        var grocery = this.state.groceries[groceryIndex];
        grocery.completed = !grocery.completed;
    
        this.setState({
          groceries: this.state.groceries
        })
      }
    
      render() {
        let groceriesComponents = [],
            newProductInput,
            newProductAddButton,
            clearListButton;
        for(var index = 0; index < this.state.groceries.length; index++) {
          groceriesComponents.push(
              <GroceryListItem
                grocery={this.state.groceries[index]}
                onComplete={this.toggleGroceryCompleteness.bind(this, index)}
              />
          );
        }
    //不理解bind(this)有什么用  onComplete={this.toggleGroceryCompleteness.bind(this, index)} 黑人问号???!!!
    // 上面那个方法调用好像是指将这个方法绑定到这个元素上,传进变量index!!!  注意理解
    //  这道题到底是要干嘛啊?给每个属性加了一个complete属性。每个 li 上有个onComplete事件,点击之后如何切换?
    //  大概意思好像是点击li 标签,实现该元素下complete的切换
        newProductInput = <input className='new-item' type="text" onChange={this.inputChanged}/>;
        newProductAddButton = <button className='add-product' onClick={this.addGroceryItem}>Add new Product</button>;
        clearListButton = <button className='clear-list' onClick={this.clearList}>Clear the List</button>;
    
        return (
          <div>
            <ul>
              {groceriesComponents}
            </ul>
            {newProductInput}
            {newProductAddButton}
            {clearListButton}
          </div>
        );
      }
    }
    
    class GroceryListItem extends React.Component {
      constructor(props) {
        super(props);
      }
    
      render() {
        //这个complete主要是切换属性  onClick方法是怎么回事?父元素中有一个onComplete方法
        let completed = this.props.grocery.completed ? "completed" : '';
        //console.log(completed);
        return (
          <li className={completed} onClick={this.props.onComplete}>
            {this.props.grocery.name}
          </li>
        );
      }
    }
    

    相关文章

      网友评论

          本文标题:react_Kons

          本文链接:https://www.haomeiwen.com/subject/nombsttx.html