状态历史记录无法在反应中正确更新

时间:2018-09-04 10:37:23

标签: javascript arrays reactjs this time-travel

我正在建造一个河内游戏塔以习惯于做出反应。我有一个名为“ disks”的状态属性,该属性是一个由3个长度为N的数组组成的数组(N为磁盘总数)。我还定义了一个状态属性“ history”,该属性应包含如下所示的磁盘阵列的历史记录:

  1. 最初:历史记录= [磁盘(初始配置)]
  2. 移动1次后:历史记录= [磁盘(初始配置),磁盘(移动1次后)]
  3. 2次移动后:历史= [磁盘(初始配置),磁盘(1次移动后),磁盘(2次移动后)]等。

但是,在M移动之后,历史记录数组如下所示:

history = [磁盘(M个移动后),磁盘(M个移动后),...,磁盘(M个移动后)]。

我找不到我的错误。如果有人知道出了什么问题,将不胜感激。以下是相关代码:

@Override
        protected void onPostExecute(Void result)

        {


            progressBarSubject.setVisibility(View.GONE);

            //CumplesListView.setVisibility(View.VISIBLE);

            if(temasHomeList != null)
            {
                ListAdapterClassTemasHome adapter = new ListAdapterClassTemasHome(temasHomeList, context);

                TemasListView.setAdapter(adapter);
                TemasListView.setClickable(true);
                TemasListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


                        String  nombre_tema = temasHomeList.get(position).nombre_tema  ;
                        String  materia = temasHomeList.get(position).materia  ;
                        String  id_tema = temasHomeList.get(position).id_tema  ;
                        String  tema_seleccionado = temasHomeList.get(position).seleccionado  ;



                        mPref = getActivity().getSharedPreferences(MIEXAMEN, Context.MODE_PRIVATE);


                        SharedPreferences.Editor editor = mPref.edit();


                        String num_examen = randomString(8);

                        editor.putString("id_tema",id_tema);




                        editor.apply();

                        // SendData();

                       // InicioFragment firstFragment = new InicioFragment();
                       // ((MainActivity)getActivity()).getSupportFragmentManager().beginTransaction()
                       //         .replace(R.id.frame, firstFragment).commit();



                    }
                });




            }
        }

请注意,游戏还可以正常工作,这意味着磁盘阵列正在正确更新等。这仅仅是历史记录阵列的更新以某种方式出了问题。我尝试将disks.slice()放入history.concat,因为在我看来,历史记录以某种方式存储了对disks阵列的引用,但这无济于事。

1 个答案:

答案 0 :(得分:0)

问题来自于此:

Go to your project folder and run:
rm -rf node_modules
yarn install or npm install

这会适当改变索引disks[i].push(disks[selected].pop()); 处的disk并变异所选的i。 因为您将这些引用存储在disk中,并继续添加引用 这些history物体中,您观察到的就是您的游戏稳定度。

为了更好地了解正在发生的事情,您可以尝试拆分history 方法分为几部分。

handleClick

您看到我为function getNewState (oldState, selectedIndex) { if (oldState.selected === selectedIndex) { return oldState; } if (isLegalMove(oldState, selectedIndex)) { return { ...oldState, selected: selectedIndex, //updated the index disks: updateDisk(oldState.disks, selectedIndex), move: oldState.move + 1 }; } return { ...oldState, selected: null }; } isLegalMove的不同部分引入了几个功能, 这些是为了分离问题,并使测试更容易。

关于使用updateDisk的注意事项:如您所见,它仅对 一个数组,这意味着如果您有一个嵌套对象,并且只对外部对象进行浅表复制 然后在其中进行变异,原始副本也会被变异。您可能想创建一个Array.prototype.slice