react icon indicating copy to clipboard operation
react copied to clipboard

Bug: Allow suppressing warning message "Warning: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop."

Open reyou opened this issue 3 years ago • 6 comments

React version:

Steps To Reproduce

  1. Pass key property to a component.
  2. Use JS logger (or simply console log) that deeply serializes to JSON.

Link to code example: https://codesandbox.io/s/intelligent-moon-17p3rq?file=/src/App.js

The current behavior

Shows following warning:

Warning: ListItem: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)

The expected behavior

Some JS logging frameworks are trying to serialize the entire object so they don't know if they should access the key property, for example:

Logger.log(props);

In this case, we get an error message because it tries to reach the key property internally. Having an option to suppress this message allows us to optionally enable/disable it. Actually, accessing any object's property (unless private thus you cannot access anyways) should not generate a runtime warning/error.

reyou avatar Nov 11 '22 23:11 reyou

This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment!

github-actions[bot] avatar Apr 09 '24 22:04 github-actions[bot]

Bump 🥁

reyou avatar Apr 09 '24 22:04 reyou

Bump

narkhedepratik avatar Apr 29 '24 18:04 narkhedepratik

I don't understand the issue, if you do Logger.log(props); you don't get the error? Can you provide an example that does not log props.key specifically (which is always a bug, since it's never accessible).

rickhanlonii avatar Apr 30 '24 02:04 rickhanlonii

Is there any option that would be to provide a configuration option that allows developers to suppress warnings related to the key prop? This could be done via an environment variable or a runtime configuration that React checks before logging such warnings. This approach would allow developers who understand the implications to opt-out of these warnings when they are sure it won't impact their application negatively.

Or can React could offer a utility function for safely serializing props, which would exclude the key prop and any other internal properties that shouldn't be manually accessed? This utility would help developers log component props without risking the inclusion of special React properties or receiving warnings.

reyou avatar Apr 30 '24 03:04 reyou

No, accessing props.key or rendering a list without a key is a bug and we do not provide APIs for ignoring warning to prevent bugs. You will only see the warning if you attempt to access props.key, if you log just props you will not get the warning.

Closing because we're not implementing the feature to ignore the warning, but if you can provide a repo where this is a bug and is logging when props.key is not being accessed, then I can re-open.

rickhanlonii avatar Apr 30 '24 03:04 rickhanlonii

Hello everybody, I wanted to suggest an enhancement related to this issue. It would be great if we could have a feature in react-reconciler that lets us override the console. This would give us the ability to customize logging in a way that fits our needs better.

For example, imagine if we could set up our HostConfig like this:

const Reconciler = require('react-reconciler');

const HostConfig = {
  // Custom console implementation
  console: {
    log: (message) => {
      // Custom log function
      myCustomLogger.log(message);
    },
    error: (message) => {
      // Custom error function
      myCustomLogger.error(message);
    },
    // Add more console methods as needed
  },
  
  // Default global console as fallback
  console: globalThis.console
};

const MyRenderer = Reconciler(HostConfig);

In this setup, the HostConfig object has a console property where we can define custom functions for log, error, and other console methods. This way, we can redirect logs to a custom logger or add extra processing before the messages are printed.

Having this feature would give us much more control over logging in our React apps, which can be especially useful in environments where the default console behavior doesn't quite cut it or needs some tweaking.

Thanks for considering this! It would be a really useful addition to react-reconciler.

twlite avatar Jun 19 '24 13:06 twlite

This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment!

github-actions[bot] avatar Sep 17 '24 14:09 github-actions[bot]