Javascript 如何访问同一类中的另一个属性中的属性

Javascript 如何访问同一类中的另一个属性中的属性,javascript,reactjs,class,object,es6-class,Javascript,Reactjs,Class,Object,Es6 Class,我是react noob玩家,我只是在我的代码周围闲逛,为其添加更多选项,现在我想做一些事情,需要从同一状态对象中的另一个属性访问状态对象中的属性,这是我的代码: class App extends Component { state = { persons : [ {name: "parsa", age: 45}, {name: "cena", age: 98}, {name: "jamil", age: 23

我是react noob玩家,我只是在我的代码周围闲逛,为其添加更多选项,现在我想做一些事情,需要从同一状态对象中的另一个属性访问状态对象中的属性,这是我的代码:

class App extends Component {
    state = {
        persons : [
          {name: "parsa", age: 45},
          {name: "cena", age: 98},
          {name: "jamil", age: 23}
        ],
    defaultPersons: [...this.state.persons]
    }
}
这里我需要复制defaultPersons属性中的persons属性,可以吗?我该怎么做

对不起,有什么困惑,还有


谢谢大家:)

您可以定义州外人员,并将数组分布到所需的位置。然而,我要说的是,你应该认真思考你为什么要这样做。有没有一种方法可以使代码变干,这样就不需要两个状态相同的对象

constructor(props) {
    super(props);
    const persons = [{key:'value'}, {key:'value'}];
    this.state = {
       persons: [...persons],
       defaultPersons: [...persons],
    }
}

您可以定义州外的人员,并将数组扩展到所需的位置。然而,我要说的是,你应该认真思考你为什么要这样做。有没有一种方法可以使代码变干,这样就不需要两个状态相同的对象

constructor(props) {
    super(props);
    const persons = [{key:'value'}, {key:'value'}];
    this.state = {
       persons: [...persons],
       defaultPersons: [...persons],
    }
}

有一种简单的方法可以实现您需要的功能:在
构造函数中初始化
状态

class App extends Component {
    constructor() {
         this.state = {
             defaultPersons : [
               {name: "parsa", age: 45},
               {name: "cena", age: 98},
               {name: "jamil", age: 23}
             ]
         };
         this.state.persons = [...this.state.defaultPersons];
     }
}
但也有一些细微差别

  • 状态应仅包含影响组件外观的动态信息(因为
    .State
    setState
    触发器
    render()
    的任何更改)。您真的需要
    defaultPersons
    成为
    .state
    的一部分吗?我认为最好直接将其设置到
    this.defaultPersons
    或甚至
    const
    外部
    this

  • 您要求的操作(以及上面我的变体)生成浅拷贝。因此,如果引用尚未更改,
    defaultPersons[1]
    的任何突变都可能会更改
    persons[1]
    项。虽然在
    状态下对数据进行变异本身就是个坏主意,但我想强调一下这一点


  • 有一种简单的方法可以实现您需要的功能:在
    构造函数中初始化
    状态

    class App extends Component {
        constructor() {
             this.state = {
                 defaultPersons : [
                   {name: "parsa", age: 45},
                   {name: "cena", age: 98},
                   {name: "jamil", age: 23}
                 ]
             };
             this.state.persons = [...this.state.defaultPersons];
         }
    }
    
    但也有一些细微差别

  • 状态应仅包含影响组件外观的动态信息(因为
    .State
    setState
    触发器
    render()
    的任何更改)。您真的需要
    defaultPersons
    成为
    .state
    的一部分吗?我认为最好直接将其设置到
    this.defaultPersons
    或甚至
    const
    外部
    this

  • 您要求的操作(以及上面我的变体)生成浅拷贝。因此,如果引用尚未更改,
    defaultPersons[1]
    的任何突变都可能会更改
    persons[1]
    项。虽然在
    状态下对数据进行变异本身就是个坏主意,但我想强调一下这一点


  • 这在一个步骤中是不可能的,因为在定义之前,没有
    This.state.persons
    来引用它,这是鸡蛋的情况。这不是特定于类属性的,在其他情况下也会出现相同的问题:

    const foo = {
      bar: 1,
      baz: foo.bar // there's no foo at this moment.
    };
    
    问题的原因是,
    defaultPersons
    不应成为国家的一部分。这似乎是一个不变的常数。在这种情况下,
    defaultPersons
    可以是一个单独的属性:

    class App extends Component {
        static defaultPersons = [
          {name: "parsa", age: 45},
          {name: "cena", age: 98},
          {name: "jamil", age: 23}
        ];
    
        state = {
            persons : [...App.defaultPersons]
        }
    
        revertToDefaultPersons() {
            this.setState(state => ({
                ...state,
                persons : [...App.defaultPersons]
            }));
        }
    }
    

    或者只是在类外部定义的常量。这使事情变得更简单,但可能会导致更少的可测试性。

    这不可能在一个步骤中实现,因为没有
    This.state.persons
    来引用它,直到它被定义为止,这是鸡蛋的情况。这不是特定于类属性的,在其他情况下也会出现相同的问题:

    const foo = {
      bar: 1,
      baz: foo.bar // there's no foo at this moment.
    };
    
    问题的原因是,
    defaultPersons
    不应成为国家的一部分。这似乎是一个不变的常数。在这种情况下,
    defaultPersons
    可以是一个单独的属性:

    class App extends Component {
        static defaultPersons = [
          {name: "parsa", age: 45},
          {name: "cena", age: 98},
          {name: "jamil", age: 23}
        ];
    
        state = {
            persons : [...App.defaultPersons]
        }
    
        revertToDefaultPersons() {
            this.setState(state => ({
                ...state,
                persons : [...App.defaultPersons]
            }));
        }
    }
    

    或者只是在类外部定义的常量。这使事情变得更简单,但可能会降低可测试性。

    您还可以使用componentDidMount更新原始状态

    class App extends Component {
        state = {
            persons : [
              {name: "parsa", age: 45},
              {name: "cena", age: 98},
              {name: "jamil", age: 23}
            ],
        defaultPersons: []
        }
    
         componentDidMount () {
         this.setState({
         defaultPersons: [...this.state.persons]
        })
      }
    }
    

    您还可以使用componentDidMount更新原始状态

    class App extends Component {
        state = {
            persons : [
              {name: "parsa", age: 45},
              {name: "cena", age: 98},
              {name: "jamil", age: 23}
            ],
        defaultPersons: []
        }
    
         componentDidMount () {
         this.setState({
         defaultPersons: [...this.state.persons]
        })
      }
    }
    

    到目前为止,您尝试过做什么?
    state=
    已用于初始状态。违约者的目的是什么?代码可能会根据使用方式进行改进。我会使用库并放入默认道具传递到应用程序。到目前为止,您尝试过做什么?
    state=
    已用于初始状态。违约者的目的是什么?代码可能会根据使用方式进行改进。我会使用库并放入默认道具传递到应用程序。伙计,你太棒了,这就是我要找的,谢谢:)很高兴它有帮助。伙计,你太棒了,这就是我要找的,谢谢:)很高兴它有帮助。