无论如何有反应来反应setState

时间:2019-01-29 18:32:42

标签: reactjs

众所周知,setState是异步的。我已经阅读了关于setState的几个问题,关于如何在setState之后立即使用值,但是这些不是我现在所需要的。

我试图为数组List设置值,然后使用该List做一个函数来获取Result的值。如果setState不异步,则将是这样

`

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_statusfragment,container,false);
    imageView = view.findViewById(R.id.imageView);
    button = (Button)view.findViewById(R.id.button2);
    textView = view.findViewById(R.id.textView);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(),"Upload screenshot",Toast.LENGTH_LONG).show();
            if(ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
                requestPermissions(
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        2000);
            }else {
                Toast.makeText(getActivity(), "Choose Screenshot", Toast.LENGTH_LONG).show();
                imageView.setVisibility(View.VISIBLE);
                button.setVisibility(View.VISIBLE);
                textView.setVisibility(View.VISIBLE);
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
                    startActivityForResult(intent,1000);
                }
            }
        }
    });
    // Inflate the layout for this fragment
    return view;
}

`

反正有实现这一目标的方法吗?研究用的文档或关键字非常棒。 非常感谢

3 个答案:

答案 0 :(得分:1)

setState有一个回调参数,状态更新后将调用

this.setState({
  list: resultList,
  result: this.doSomething(resultList)
}, () => {
    //do something with the updated this.state
});

答案 1 :(得分:0)

您可以像使用异步等待

Solution
- App_Code
  - EmployeeDS.cs
  - BLL
  - DAL
    - InventarioCiclicoDB.edmx

答案 2 :(得分:0)

不建议将this.statethis.setState一起使用,这完全是因为状态更新是异步的,并且可能导致竞争状态。

如果更新的状态是从先前的状态派生的,则应使用state updater function。因为它是异步的,所以由于合成事件在React中的工作方式,应事先处理事件对象:

const { id, value } = e.target;
this.setState(state => {
  const list = [...state.list];
  list[id] = value;

  return {
    list,
    result: this.doSomething(list)
  };
});