JSFiddle - React, Tailwind, and code Playground

HTML

<button id='b'>append1</button>
<button id='c'>append2</button>
<button id='undo'>undo</button>
<button id='redo'>redo</button>
<br>
<textarea id='t'></textarea>

JavaScript

$(function () {

    // Check to see if an array is not already defined.
    if (!$('#t').data('old-val')) {

        // If the check returns True we proceed to create an array in old-val.
        $('#t').data('old-val', []);

    }

    // Get the current value of content.
    inputValue = $('#t').val();

    // Push it to the old-val array.
    $('#t').data('old-val').push(inputValue);

    // We start with a current array position of 0.
    curArrPos = 0;


    $('#c').click(function () {
        // Append a string to the #t.
        $('#t').val(' ==this is the 2nd appended text==');


        // Save the current #t value.
        inputValue = $('#t').val();
        // Push it to the array.
        $('#t').data('old-val').push(inputValue);
        // Increment current array position.
        ++curArrPos;

    });


    $('#b').click(function () {
        // Append a string to the #t.
        $('#t').val(' ==this is the 1st appended text==');


        // Save the current #t value.
        inputValue = $('#t').val();
        // Push it to the array.
        $('#t').data('old-val').push(inputValue);
        // Increment current array position.
        ++curArrPos;

    });

    $('#undo').click(function () {
        // First check that the old-val array length is greater than 1 (It's the initial position. No need undoing to a blank state) and current array position greater than 0 (for the same reason).
        if ($('#t').data('old-val').length > 1 && curArrPos > 0) {

            // Set current #t value to the one in the current array position, minus one.
            // Minus one gets you to the previous array position (ex. current=5; previous= current - 1 = 4).
            $('#t').val($('#t').data('old-val')[curArrPos - 1]);

            // Decrease current array position, because we effectively shifted back by 1 position.
            --curArrPos;
        }
    });

    $('#redo').click(function () {
        // In my own code I have an if check too, but this...